本篇学习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