每日C++ - STL常见容器初始化

每日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 容器初始化的简单介绍就到这里啦,有什么补充的欢迎各位同学留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值