用C++编程,肯定会用到STL库,因为我们不希望重复的造轮子.本篇博客主要梳理一下STL中的容器以及个人的小小见解.

vector

毋庸置疑,vector是使用最频繁的STL容器.其实它相当于是数组.只是这个数组可以不同时装不同类型的数据和对象.

1
2
3
4
vector<int> vec={1,2,3};
// 经典数组使用方式
for(int i=0;i<vec.size();++i)
cout<<vec[i]<<endl;

不过,单单将其想为数组,人家还有类似堆栈的操作

1
2
vec.push_back(4);
vec.pop_back();

list

在STL中,list表示的是双端链表.自然需要链表这种数据结构是就该用它.

1
2
3
4
5
6
7
// 双端链表,两端都可以取值
cout<<mylist.front()<<endl;
cout<<mylist.back()<<endl;
// 插入数据,需要先指定一个迭代器表示插入位置
list<int>::iterator it=mylist.begin();
it++;
mylist.insert(it,4);

deque

其实看到这个名字就大概猜测到是双端队列.注意队列有FIFO特性.

1
2
3
4
5
6
7
deque<int> q={1,2,3};
// 从前端出队列
q.pop_front();
// 从后端出队列
q.pop_back();
for(auto i:q)
cout<<i<<endl;

set

这个家伙代表的是集合,自然会联想到数学中的集合.没错这哥们通过调用算法,有并集,补集等集合运算的功能.注意这家伙是关联式容器,不能有重复元素,有序.

1
2
3
4
5
6
7
8
9
10
11
12
set<int> myset1={1,2,5,4};
set<int> myset2={3,4,6};
vector<int> vec(10);
vector<int>::iterator it;
// 并集运算函数
it=set_union(myset1.begin(),myset1.end(),myset2.begin(),myset2.end(),vec.begin());
// 删除vec中多余的数据
vec.resize(it-vec.begin());
set<int> myset3(vec.begin(),vec.end());
for(auto i:myset3)
cout<<" "<<i;
cout<<endl;

map

我们可以把它当做映射,即key-value形式.它也是关联式容器,key值唯一,有序.

1
2
3
4
5
6
7
8
9
10
11
12
// 这里用pair初始化了
map<int, string> m = {
std::make_pair(0, "zero"), std::make_pair(1, "one"), std::make_pair(2, "two")
};
int key = 0;
for (auto &i : m) {
if (i.second == "two") {
key = i.first;
break; // to stop searching
}
}
cout << key << endl;

pair

它叫做,于map最大的区别就是它只能表示一对元素.它通常在如下两个应用场景使用:
1.map中捆绑一对元素.
2.当函数有两个返回值时.