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

调用了三次有参构造函数

相关推荐
学java的小菜鸟啊9 分钟前
第五章 网络编程 TCP/UDP/Socket
java·开发语言·网络·数据结构·网络协议·tcp/ip·udp
我爱吃福鼎肉片13 分钟前
【C++】——list
c++·vector·list
立黄昏粥可温14 分钟前
Python 从入门到实战22(类的定义、使用)
开发语言·python
PerfMan17 分钟前
基于eBPF的procstat软件追踪程序垃圾回收(GC)事件
linux·开发语言·gc·ebpf·垃圾回收·procstat
聆听HJ25 分钟前
java 解析excel
java·开发语言·excel
溪午闻璐28 分钟前
C++ 文件操作
开发语言·c++
环能jvav大师37 分钟前
基于R语言的统计分析基础:使用SQL语句操作数据集
开发语言·数据库·sql·数据分析·r语言·sqlite
吱吱鼠叔41 分钟前
MATLAB方程求解:1.线性方程组
开发语言·matlab·php
Antonio9151 小时前
【CMake】使用CMake在Visual Studio内构建多文件夹工程
开发语言·c++·visual studio
LyaJpunov1 小时前
C++中move和forword的区别
开发语言·c++