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

调用了三次有参构造函数

相关推荐
寻星探路7 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
lly2024068 小时前
Bootstrap 警告框
开发语言
2601_949146539 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
曹牧9 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
在路上看风景9 小时前
19. 成员初始化列表和初始化对象
c++
KYGALYX9 小时前
服务异步通信
开发语言·后端·微服务·ruby
zmzb01039 小时前
C++课后习题训练记录Day98
开发语言·c++
念风零壹10 小时前
C++ 内存避坑指南:如何用移动语义和智能指针解决“深拷贝”与“内存泄漏”
c++
猫头虎10 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
YUJIANYUE10 小时前
PHP纹路验证码
开发语言·php