1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 using namespace std; 5 6 bool cmp(const pair<int ,int > &a,const pair<int ,int > &b) 7 { 8 return a.second < b.second;//由小到大排序 9 } 10 11 int main() 12 { 13 int i,j,k,T; 14 int num; 15 cin>>num; 16 vector <pair<int ,int> > a; 17 for(i=0;i<num;i++) 18 { 19 int x,y; 20 cin>>x>>y; 21 a.push_back(make_pair(x,y));//注意make_pair后面是圆括号 22 } 23 int _size = a.size(); 24 //sort(&a[0],&a[_size],cmp);//第一个不是&a 25 sort(a.begin(),a.end(),cmp);//上写两个均可排序 26 vector <pair<int ,int> > ::iterator iter; 27 for(iter=a.begin();iter!=a.end();iter++) 28 cout<<iter->first<<" "<<iter->second<<endl; 29 while(1); 30 return 0; 31 } 32 33
判断存在与否,过去一直用的是count方法。
map插入数据,以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的,当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值
注意:下面是在2012成都预选赛时想起的问题
map <int,bool> mm;
map <int,bool> ::iterator ptr;
怎样让迭代器指向第三个元素
ptr = mm.begin()+2,这样会编译错误,分两次自增又太麻烦。
还有就是怎样直接返回第三个位置的元素
对于第一个问题,可以advance(ptr,2)
第二个问题实际上是随机访问的问题, map不可以的,还是 advance(ptr,2),输出*ptr
在涉及到容器和算法的操作中,还有两个迭代器函数非常有用:
· advance() 按指定的数目增减迭代器。
· distance() 返回到达一个迭代器所需(递增)操作的数目。
例如:
list iList;
list::iterator p =
find(iList.begin(), iList.end(), 2);
cout << "before: p == " << *p << endl;
advance(p, 2); // same as p = p + 2;
cout << "after : p == " << *p << endl;
int k = 0;
distance(p, iList.end(), k);
cout << "k == " << k << endl;
advance()函数接受两个参数。第二个参数是向前推进的数目。对于前推迭代器,该值必
须为正,而对于双向迭代器和随机访问迭代器,该值可以为负。
使用 distance()函数来返回到达另一个迭代器所需要的步骤。
注意
distance()函数是迭代的,也就是说,它递增第三个参数。因此,你必须初始化该参数
。未初始化该参数几乎注定要失败。