list学习之插入操作insert, emplace, size, max_size

这篇博客探讨了C++中list容器的插入操作,包括insert和emplace方法。通过代码示例展示了它们的使用,并通过性能测试指出emplace在效率上优于insert。此外,还介绍了size和max_size成员函数,用于获取list的元素数量和最大容量。
摘要由CSDN通过智能技术生成

本篇学习list的插入操作

insert:插入元素

emplace:原位构造元素

size:返回容纳的元素数

max_size:返回可容纳的最大元素数

代码实现:

#include <list>
#include <vector>
#include <iostream>
#include <time.h>

using namespace std;

class Person4
{

public:
    Person4(string name):
        m_strName(name)
    {

    }

    string m_strName;
};


void insertElement()
{
    list<Person4> list1;
    string strName =  "《出塞(王昌龄)》秦时明月汉时关,万里长征人未还。但使龙城飞将在,不教胡马度阴山。";
    Person4 person(strName);
    //int = [-2147483648, 2147483647]
    const int count = 214748;//2147483648
    //1.insert:插入元素
    double startTime1 = clock();//1计算开始
    for(int i = 0; i < count; i++)//214748
    {
        list1.insert(list1.begin(), strName);
    }
    double endTime1 = clock();//1时间结束
    list1.clear();
    cout << "for    1 run time is: " << (double)(endTime1 - startTime1) / CLOCKS_PER_SEC << "s" << endl;
    cout << endl;

    //2.emplace:原位构造元素
    list<Person4> list2;
    double startTime2 = clock();//1计算开始
    for(int i = 0; i < count; i++)//214748
    {
        list2.emplace(list2.begin(), strName);
    }
    double endTime2 = clock();//1时间结束
    list2.clear();
    cout << "for    1 run time is: " << (double)(endTime2 - startTime2) / CLOCKS_PER_SEC << "s" << endl;
    cout << endl;
    //3.size:返回容纳的元素数
    list<int> list3;
    cout << "list3.size = " << list3.size() << endl;
    list3.assign({23, 45, 13, 85});
    cout << "list3.size = " << list3.size() << endl;
    //4.max_size返回可容纳的最大元素数.此值通常反映容器大小上的理论极限,
    //至多为 std::numeric_limits<difference_type>::max() 。
    //运行时,可用 RAM 总量可能会限制容器大小到小于 max_size() 的值。
    list<int> list4;
    cout << "list4.size = " << list4.size() << " list4.max_size = " << list4.max_size() << endl;
    list4 = {56, 983, 234, 98};
    cout << "list4.size = " << list4.size() << " list4.max_size = " << list4.max_size() << endl;
    //向list5第一个元素之后插入70这个元素
    list<int> list5 = {23, 67, 21};
    list5.insert(list5.begin(), 70);
    cout << "list5的值为:" << endl;
    for(auto &val: list5)
    {
        cout << val << "\t";
    }
    cout << endl;
    //向list6第一个元素之后插入3个98
    list<int> list6 = {10, 20, 30};
    list6.insert(list6.begin(), 3, 98);
    cout << "list6的值为:" << endl;
    for(auto &val: list6)
    {
        cout << val << "\t";
    }
    cout << endl;

    //向list7第一个元素之后插入vector的第二个元素到最后一个元素之间的值
    vector<int> vec = {11, 12, 13, 14};
    list<int> list7 = {21, 22, 23};
    list7.insert(list7.begin(), ++vec.begin(), vec.end());
    cout << "list7的值为:" << endl;
    for(auto &val: list7)
    {
        cout << val << "\t";
    }
    cout << endl;
    list7.clear();
    cout << endl;

    //emplace插入用法
    //向list8第一个元素之后插入55这个元素
    list<int> list8 = {27, 37, 41};
    list8.emplace(list8.begin(), 55);
    cout << "list8的值为:" << endl;
    for(auto &val: list8)
    {
        cout << val << "\t";
    }
    cout << endl;
    //向list9第一个元素之后插入3个67
//    list<int> list9 = {40, 50, 60};
//    list9.emplace(list9.begin(), 3, 67);//不支持
//    cout << "list9的值为:" << endl;

    //向list10第一个元素之后插入vector的第二个元素到最后一个元素之间的值
//    vector<int> vec1 = {15, 16, 17,18};
//    list<int> list10 = {25, 26, 27};
//    list10.emplace(list10.begin(), ++vec1.begin(), vec1.end());//不支持
//    cout << endl;

}

int main()
{
    insertElement();
    cout << endl;

    cout << " Hello World!" << endl;
    return 0;
}

运行结果:

由以上结果可以看到emplace要比insert效率高很多,但在插入多个值和插入范围值时,emplece不支持,上面注释的代码可以看出。

参考:

http://www.cplusplus.com/reference/list/list/
https://zh.cppreference.com/w/cpp/container/list

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值