栈和队列共同支持的操作
s1 op s2 op可以是==、!=、<、<=、>、>=之一,它会对两个容器适配器之间的元素按字典序进行比较
s.size() 返回s的元素个数
s.empty() 返回s是否为空
s.push(t) 将元素t压入到s中
s.pop() 将一个元素从s中弹出,对于栈来说,每次弹出的是最后被压入的元素,
而对于队列,每次被弹出的是最先被压入的元素
不支持迭代器,因为它们不允许对任意元素进行访问
栈和队列不同的操作
栈的操作
s.top() 返回栈顶元素的引用
队列操作
s.front() 获得队头元素的引用
s.back() 获得队尾元素的引用
利用栈反向弹出单词:
#include "stdafx.h"
#include<stack>
#include<iostream>
#include<string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
stack<char>s;
string words;
cin >> words;
for (string::iterator iter = words.begin(); iter != words.end(); iter++) //迭代器默认空位置为结束
s.push(*iter);
while (!s.empty())
{
cout << s.top();
s.pop();
}
cout << endl;
return 0;
}
集合(set):用来存储一组无重复的元素,集合中的元素本身是有序的,所以可以高效地查找指定元素,也可以方便地得到指定大小范围的元素在容器中所处的区间。
#include<utility>
#include "stdafx.h"
#include<set>
#include<iostream>
#include<iterator>
#include<string>
#include<algorithm>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
set<int>s;
while (true)
{
int num;
cin >> num;
if (num == 0)
break;
pair<set<int>::iterator, bool> r = s.insert(num);
//iterator表示插入的位置,bool标志着插入是否成功,若key_value已经在set中,则iterator表示key_value在set中的位置
if (!r.second) //已经存在,没有成功插入,返回0。若插入成功,则返回1,r是pair类型,有first的迭代器和second的bool
cout << num << "has duplicated" << endl;
}
set<int>::iterator iter = s.begin();
set<int>::iterator itera = s.end();
int mid = (*iter + *(--itera)) / 2; //itera是尾后迭代器,指向的是末尾元素后一个位置,所以要使用的话,需要先将其位置减1,往前挪
cout << "<=mid" << endl;
copy(s.begin(),s.upper_bound(mid), ostream_iterator<int>(cout, " ")); //s.upper_bound(mid)是将mid作为区间的最大值
cout << endl;
cout << ">=mid" << endl;
copy(s.lower_bound(mid), s.end(), ostream_iterator<int>(cout, " ")); //s.lower_bound(mid)是将mid作为区间的最小值
return 0;
}
映射(map):与集合的区别:
集合的元素类型是键本身,映射的元素类型是由键和附加数据所构成的二元组,在集合中按照键查找一个元素时,一般用来确定这个元素是否存在
在映射中,按照键查找一个元素时,除了能确定它的存在外,还可以得到相应的附加数据。
有四门课程,每门课程有相应学分,选其中三门,并求和:
#include<utility>
#include "stdafx.h"
#include<map>
#include<iostream>
#include<string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
map<string, int>courses;
courses.insert(make_pair("csapp", 3));
courses.insert(make_pair("C++", 4));
courses.insert(make_pair("math", 5));
courses.insert(make_pair("english", 6));
int num = 2;
int sum = 0;
while (num > 0)
{
string name;
cin >> name;
map<string, int>::iterator it = courses.find(name);
if (it == courses.end())
{
cout << name << "is not a vailable courses" << endl;
}
else
{
sum += it->second;
courses.erase(it);
--num;
}
}
cout << "total credit:" << sum << endl;
return 0;
}