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插入元素

调用了三次有参构造函数

相关推荐
freyazzr几秒前
C++八股 | Day2 | atom/函数指针/指针函数/struct、Class/静态局部变量、局部变量、全局变量/强制类型转换
c++
ascarl20106 分钟前
准确--k8s cgroup问题排查
java·开发语言
fpcc1 小时前
跟我学c++中级篇——理解类型推导和C++不同版本的支持
开发语言·c++
莱茵菜苗1 小时前
Python打卡训练营day46——2025.06.06
开发语言·python
爱学习的小道长1 小时前
Python 构建法律DeepSeek RAG
开发语言·python
luojiaao1 小时前
【Python工具开发】k3q_arxml 简单但是非常好用的arxml编辑器,可以称为arxml杀手包
开发语言·python·编辑器
终焉代码2 小时前
STL解析——list的使用
开发语言·c++
SoFlu软件机器人2 小时前
智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao
java·开发语言·架构
英英_2 小时前
视频爬虫的Python库
开发语言·python·音视频
DevangLic2 小时前
【 *p取出内容 &a得到地址】
c++