STL¶
标准模板库。
分类:
- sequential
- array
- vector
- deque
- forward_list
- list
- associative,多用红黑树实现
- set
- map
- multiset,multimap
- unordered associative,哈希表实现
- adaptors
- stack,queue,priority_queue...
vector¶
access¶
- front返回第一个,back返回第二个
- data用于获取容器底层储存数据的指针
at和 [ ]¶
二者的用法都是传入访问的索引,返回该位置的元素。
不同的是,at会检测索引是否超出容器范围,而operator [ ]不会抛出异常。为了防止越界,多用push_back和resize
迭代器¶
类似数组的访问:
可以用迭代器访问,迭代器类似于指针,首先定义迭代器变量然后使用他,begin(),end()等方法返回的都是迭代器。
for(vector<int>::iterator it = a.begin();it<a.end();it++){
cout<<*it;
}
/* 可以直接把类型简化为auto */
//for(auto it = a.begin();it<a.end();it++)
/* 更简单的: */
//for(int i : a){cout <<i};
capacity¶
- empty
- size,capacity
- reserve:预分配容器容量,不改变size只改变capacity
- 如:vec.reserve(10);
modifiers¶
vector<int> a;
a.push_back(2);
a.insert(a.begin()+4,5,10); //插入的位置,插入数量(可省略),插入元素
a.clear(); //清空容器,即size清零
a.erease(a.begin()+4); //删除某个位置,后面的元素会自动补上来
map¶
是键值对,由于底层是红黑树,会自动排好序。
循环遍历:
for(const auto& pair: my_map){
cout<< pair.first << pair.second;
}
for(const auto& [word,cnt]:word_map){};
注意[ ]
这个操作符,当我们查找的key值在map里面时,这是一个查找操作;但是如果key值不在map里,会自动将这个key添加到map里并把对应值初始化为0.检查是否包含:map.contains(key)
例如设计一个词频统计器:
algorithm¶
works on a range defined as [first,last).左闭右开。
- for_each,find,count
- sort
- min_element,max_element
其他¶
copy¶
copy的使用,注意当没有定义u的长度时,copy传入的第三个参数不能使用u.begin(),而应该用其他迭代器,否则会溢出:
vector<int> v={1,2,3,4};
vecotr<int> u;
copy(v.begin(),v.end(),back_inserter(u)); //1,2,3,4
copy(v.begin(),v.end(),front_inserter(u)); //4,3,2,1
copy(u.begin(),u.end(),ostream_iterator<int>(cout,","));
注意事项¶
- erase会返回一个迭代器,应该使用这个返回的迭代器而不能继续用原来的,因为原来的已经erase掉了
- 用empty()判断比size()=0判断更快