STL容器

vector

/*

  1. vector的基本使用

  2. 如何优化

  3. 使用emplace_back() 代替 push_back()

emplace_back 用于在容器末尾直接构造一个新的对象,而不是先构造一个对象然后将其复制或移动到容器中。它接受构造对象所需的参数,并在容器末尾直接构造该对象。这种方法避免了不必要的拷贝或移动操作,通常在性能上更为高效。

push_back 用于将一个已有的对象添加到容器的末尾。它接受一个对象(或者对象的副本),并将这个对象的副本存储在容器中, 具体来说,它会调用对象的拷贝构造函数或移动构造函数来创建容器中存储的对象。

  1. 若知道容器中可能存在具体的数据个数,调用reserve初始化容器大小

*/

cpp 复制代码
/*
    1. vector的基本使用 
    2. 如何优化
        1. 使用emplace_back() 代替 push_back()
            emplace_back 用于在容器末尾直接构造一个新的对象,而不是先构造一个对象然后将其复制或移动到容器中。
                它接受构造对象所需的参数,并在容器末尾直接构造该对象。这种方法避免了不必要的拷贝或移动操作,通常在性能上更为高效。
            push_back 用于将一个已有的对象添加到容器的末尾。它接受一个对象(或者对象的副本),并将这个对象的副本存储在容器中。
                具体来说,它会调用对象的拷贝构造函数或移动构造函数来创建容器中存储的对象。

        2. 若知道容器中可能存在具体的数据个数,调用reserve初始化容器大小
*/

#include<iostream>
using namespace std;
#include<vector>

class Entry
{
    private:
        int a,b,c;

    public:
        Entry(int a, int b, int c) : a(a),b(b),c(c)
        {
            cout<<"copied!"<<endl;
        }

        Entry(const Entry & other) : a(other.a),b(other.b),c(other.c)
        {
            cout<<"copy copied!"<<endl;
        }

    friend ostream& operator<<(ostream& stream, Entry& entry);
};


ostream& operator<<(ostream& stream, Entry& entry)
{
    stream<<entry.a<<" "<<entry.b<<" "<<entry.c;
    return stream;
}


int main()
{
    //Entry e1(1,2,3);

    vector<Entry> entries;
    // copy 9 times  -> copy 6 times
    entries.reserve(3);
    // entries.push_back({3,2,4});
    // entries.push_back({6,8,7});
    // entries.push_back({6,8,7});

    // copy 6 times -> copy 3 times
    entries.emplace_back(3,2,4);
    entries.emplace_back(6,8,7);
    entries.emplace_back(1,2,9);

    for(Entry & it : entries)
    {
        cout<< it <<endl;
    }

    // entries.erase(entries.begin()+1);

    // for(auto & it : entries)
    // {
    //     cout<<it<<endl;
    // }


    return 0;
}

未预分配存储空间 并使用push_back插入元素

调用了三次有参构造函数和六次拷贝构造函数

使用预分配存储空间并使用push_back插入元素

调用了三次有参构造函数和三次拷贝构造函数

使用预分配存储空间并使用emplace_back插入元素

调用了三次有参构造函数

相关推荐
Moweiii25 分钟前
SDL3 GPU编程探索
c++·游戏引擎·图形渲染·sdl·vulkan
渝妳学C1 小时前
【C++】类和对象(下)
c++
数据小小爬虫1 小时前
Python爬虫获取AliExpress商品详情
开发语言·爬虫·python
小爬虫程序猿1 小时前
利用Python爬虫速卖通按关键字搜索AliExpress商品
开发语言·爬虫·python
一朵好运莲1 小时前
React引入Echart水球图
开发语言·javascript·ecmascript
EleganceJiaBao1 小时前
【C语言】结构体模块化编程
c语言·c++·模块化·static·结构体·struct·耦合
Eiceblue1 小时前
使用Python获取PDF文本和图片的精确位置
开发语言·python·pdf
xianwu5431 小时前
反向代理模块。开发
linux·开发语言·网络·c++·git
xiaocaibao7771 小时前
Java语言的网络编程
开发语言·后端·golang
Bucai_不才2 小时前
【C++】初识C++之C语言加入光荣的进化(上)
c语言·c++·面向对象