每日C++ - STL常见容器初始化
我们在日常使用 STL 模板库时,往往忽略了容器初始化的特征。这里我们来讨论下常见容器的初始化。
list 初始化
list 支持的初始化形式很多,我们可以查看 list 的源码实现,常见初始化方式如下:
list<int> list1; // 默认初始化
list<int> list2(10); // 初始化 list,list 包含 10 个为 0 的元素
list<int> list3(10, 1); // 初始化 list, list 包含 10 个为 1 的元素
list<int> list4 = list3; // 拷贝赋值初始化
list<int> list5(list4); // 拷贝构造初始化
list<int> list6;
int a[10] = {1};
list6.insert(list6.begin(), a, a + 10); // 利用数组初始化 list 元素
list<int> list7 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 以下方式初始化都是可以,但是 list = int[] 不行
list<int> list8{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
list<int> list9({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
依次打印 list,结果如下
// 第一个为空
0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
vector 初始化
动态数组初始化应该是我们使用场景最多的,与 list 相似。
vector<int> vec1;
vector<int> vec2(10);
vector<int> vec3(10, 1);
vector<int> vec4(vec3);
vector<int> vec5 = vec4;
vector<int> vec6;
int a[10] = {1};
vec6.insert(vec6.begin(), a, a + 10);
vector<int> vec7 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector<int> vec8{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector<int> vec9({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
依次打印 vector,结果如下
// 第一个为空
0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
deque 初始化
deque<int> deq1;
deque<int> deq2(10);
deque<int> deq3(10, 1);
deque<int> deq4 = deq3;
deque<int> deq5(deq4);
deque<int> deq6;
int a[10] = {1};
deq6.insert(deq6.begin(), a, a + 10);
deque<int> deq7 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
deque<int> deq8{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
deque<int> deq9({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
依次打印deque,结果如下
// 第一个为空
0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
set 初始化
set 内部存储是通过 rbtree 数据结构实现的,它对存储的数据会自动排序,并且每个元素值都是唯一存在的。
set<int> set1;
set1.insert(1);
// 可以传入数组数据的开始地址和结束地址
int a[10] = {1};
set<int> set2(a, a + 10);
list<int> lst(10, 1);
// 迭代器的起始,结束位置
set<int> set3(lst.begin(), lst.end());
vector<int> vec(10, 1);
set<int> set4(vec.begin(), vec.end());
deque<int> deq(10, 1);
set<int> set5(deq.begin(), deq.end());
set<int> set6 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
set<int> set7{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
set<int> set8({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
依次打印 se’t,结果如下
1
0 1
1
1
1
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
我们也可以看到,set3,set4,set5 都只有一个元素 1,这就是 set 的特性。
map 初始化
map 的内部实现与 set 是相同的,只不过保存的是键值对。
map<int, int> map1;
map<int, int> map2{ {1, 2}, {2, 2} };
map<int, int> map3(map2);
map<int, int> map4;
map4[1] = 4;
map4[2] = 4;
map<int, int> map5;
map5.insert(map5.begin(), {1, 5});
map5.insert(map5.begin(), {2, 5});
map<int, int> map6;
map6.insert(make_pair(1, 6));
map6.insert(pair<int, int>(2, 6));
// 可以使用 map6.emplace(pair<int, int>(2, 6)) 替代
map<int, int> map7 { {1, 7}, {2, 7} };
map<int, int> map8({ {1, 8}, {2, 8} });
map<int, int> map9 = { {1, 9}, {2, 9} };
依次打印 map,结果如下
// 第一行为空
1 = 2; 2 = 2;
1 = 2; 2 = 2;
1 = 4; 2 = 4;
1 = 5; 2 = 5;
1 = 6; 2 = 6;
1 = 7; 2 = 7;
1 = 8; 2 = 8;
1 = 9; 2 = 9;
常见的 STL 容器初始化的简单介绍就到这里啦,有什么补充的欢迎各位同学留言。