STL里面的所有容器都有迭代器的概念,迭代器分为好几类,有只读的,有随机的
有顺序的,等等。C++当初在设计迭代器的时候,是想把它设计成指针那么用,类似一个数组指针,我们可以对其进行++和—操作,可以*它,也可以->它。这些指针具有的操作,迭代器基本都有
之所以要一对迭代器而不是一个迭代器,是因为迭代器本身就是一个范围,这个范围是左开右闭的,如[a,b),用if判断的方法就是 a<=c && c < b;
由此我们可以得知std::end(c)是不存在的
正序输出和倒序输出:
//Begin和rbegin: 一个正序,一个倒序
Sort(rbegin(xs), rend(xs)); //倒序排序
顺序容器介绍:
Stack:返回栈顶,push入栈,pop出栈,empty看看是不是空的,size容器里到底有多少东西。items.top()查看栈顶元素,可以作为返回值
stack.push() //入栈
stack.pop() //出栈
stack.empty() //看看是否为空
stack.size() //容器大小
stack.top() //栈顶内容可以作为返回值
队列queue:
front()返回队头
back()返回队尾
push()入列
pop()出列
empty()看看是不是空的
size()容器里有多少东西
链表list:
list.list.push_front()
list.push_back() //往链表头或链表尾插入数据
list.Pop_front()
list.pop_back() //从链表头或链表尾拿走数据
list.Size() //容器里有多少东西
MAP和MultiMap:
map类似python的字典,存储一个键值对,map一个键只能对应一个值,multimap一个键可以对应多个值
插入方法:
transcript.insert(make_pair(name, grade));
Insert:插入一个pair,如果key存在的话那么返回值的第二项是false;
Find:查找一个key erase:删除一个key
Clear清空map count:返回key的数量
Set和map类似,区别在于有没有绑定一个value给key
优先队列Priority_queue:
PQ.Push() //插入一个对象并排序
PQ.Pop() //弹出队首对象,不指定方式会弹出最大的那个
PQ.Top() //返回队头
PQ.Size() //返回对象的数量
PQ.Empty() //返回是否为空
STL常用函数
<algorihm> <numeric> <functional> 这几个文件中里面有丰富的函数,可以非常灵活地去运用,下面列举了几个常用函数及使用方法,放便以后实践中参考使用
//将数组中的元素全部同乘以2
vector<int> ccaseOne{ 1,2,3,4,5 };
transform(begin(ccaseOne), end(ccaseOne), begin(ccaseOne), [](int a) {return a * 2; });
//将列表中符和条件的元素进行复制
vector<int> ccaseTwo{ 2,12,15,20,25 };
vector<int> ccaseThree;
copy_if(begin(ccaseTwo),end(ccaseTwo), back_inserter(ccaseThree), [](int a) {return a % 2 == 1; });
//字符串连接
vector<string> st{ "I","am","english","leaner" };
cout << accumulate(begin(st), end(st), string(), [](const string &a, const string& b) {return a == "" ? b : a + " " + b; }) << endl; //accumualte是计算函数
//计算标准差
vector<double> xs{ 1,1,1,1,1,1,1,1,1,10 };
auto sum = accumulate(begin(xs), end(xs), 0.0, plus<double>());
auto average = sum / xs.size();
auto sumOfSquares = accumulate(begin(xs), transform(begin(xs), end(xs), begin(xs), [](auto x) {return x * x; }), 0.0, plus<double>());
cout << sqrt(sumOfSquares / xs.size() - average * average) << endl;
//计算公共字串
vector<string> xs{ "abc1","abd","ab","abc2" };
auto first = xs.at(0);
auto prefix = accumulate(begin(xs) + 1, end(xs), end(first), [&](auto it, auto str) {
return mismatch(begin(first), it, begin(str), end(str)).first;
});