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

调用了三次有参构造函数

相关推荐
我不会编程55514 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
李少兄14 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
懒羊羊大王&15 小时前
模版进阶(沉淀中)
c++
无名之逆15 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
似水এ᭄往昔15 小时前
【C语言】文件操作
c语言·开发语言
啊喜拔牙15 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
owde15 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
xixixin_15 小时前
为什么 js 对象中引用本地图片需要写 require 或 import
开发语言·前端·javascript
GalaxyPokemon16 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
W_chuanqi16 小时前
安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft