亿些STL的东西
按照SteelBallRun说的,本文将会介绍set,map,vector和pair
set
set
是按特定顺序存储唯一元素的容器。——C++ Reference
所谓特定顺序
默认为升序。
定义
如果要定义一个存放int的set
set<int> s;
如果要定义降序排列的set
set<int, greater<int> > s;
成员函数
迭代器
begin() | end() | rbegin() | rend() |
---|---|---|---|
开始 | 结束 | 逆序开始 | 逆序结束 |
另外还有几个const版本,需要c++11,用法和上面的一样
begin() | end() | rbegin() | rend() | |
---|---|---|---|---|
const | cbegin() | cend() | crbegin() | crend() |
这些都是$STL$的基本常识了,以后不会再赘述
遍历一个set:
for(set<int>::iterator i = s.begin();i != s.end();++i)
更简单的写法:需要c++11
for(auto i = s.begin();i < s.end();++i)
如果不需要更改set,更更简单的写法:仍然需要c++11
for(auto i : s)或者for(auto &i : s)
这两种的区别在于,第一种可以在循环中更改i的值,而第二种不行
因为第二种的i是一个const引用,是set的特性(别的容器不一样)
但无论如何,用哪一种都不能通过i更改s内部的值(要用前两种)
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s;
for(int i = 1;i <= 5;++i) s.insert(i);
for(auto i : s) cout << i << " "; //输出1 2 3 4 5
cout << endl;
for(auto i : s) ++i, cout << i << " "; //输出2 3 4 5 6,但s内部没有改变
cout << endl;
for(auto i = s.begin();i != s.end();++i) cout << *i << " "; //输出1 2 3 4 5,因为s内部没有改变
cout << endl;
for(auto &i : s) ++i, cout << i << " "; //CE!
cout << endl;
for(auto &i : s) cout << i << " "; //没有问题,输出1 2 3 4 5
}
还是常识
s.empty()
:返回s是否为空
s.size()
: