学习STL中遇到的问题
一, vector
- vector对象用数组方式访问时,不会自动扩张,只能访问已有的元素。
例如下面的代码就是错误的:
#include <vector>
#include <iostream>
int main()
{
vector<int> test;
test[0] = 2;
return 0;
}
二,set
- set集合的迭代器遍历,用set集合的迭代器的时候是没有办法比较大小的,例如下面的代码是错误的,
#include <set>
#include <iostream>
int main()
{
set<int> s;
s.insert(8);
s.insert(1);
s.insert(3);
set<int>::iterator it;
for(it=s.begin();it<s.end();it++)//这里it<s.end()会报错
cout<<*it<<" ";
cout<<endl;
return 0;
}
- 元素反向遍历
需要使用reverse_iterator迭代器
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s;
s.insert(8);
s.insert(1);
s.insert(12);
s.insert(6);
s.insert(8);
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<*it<<" ";
cout<<endl;
set<int>::reverse_iterator rit;
for(rit=s.rbegin();rit!=s.rend();rit++)
cout<<*rit<<" ";
cout<<endl;
return 0;
}
三、map
- map元素的插入
map元素可以直接用数组的方式插入新元素,例子如下:
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<int,int> m;
m[1] = 4;
m[2] = 3;
m[3] = 2;
m[4] = 1;
map<int,int>::iterator it;
for(it=m.begin();it!=m.end();it++)
cout<<(*it).first<<" : "<<(*it).second<<endl;
return 0;
}
四、deque双端队列
- 从头部插入元素以及从中间插入元素
从《ACM程序设计(第2版)》一书中看到对deque的介绍,说push_front和insert两个函数都不会增加新元素,只会将原有的元素覆盖,但是实际测试时却不是这样,在分别调用这两个函数之后,发现数组的元素时增加了的。实验的源代码如下:
#include <iostream>
#include <map>
#include <string>
#include <deque>
using namespace std;
int main()
{
deque<int> d;
int i;
d.push_back(1);
d.push_back(2);
d.push_back(3);
for(i=0;i<d.size();i++)
{
cout<<d[i]<<" ";
}
cout<<endl;
d.push_front(10);
d.push_front(20);
for(i=0;i<d.size();i++)
{
cout<<d[i]<<" ";
}
cout<<endl;
d.insert(d.begin()+1,88);
for(i=0;i<d.size();i++)
{
cout<<d[i]<<" ";
}
cout<<endl;
return 0;
}
五、list
- 迭代器只能进行
"
+
+
"
"++"
"++"或者
"
−
−
"
"--"
"−−"操作,不能进行
+
n
+n
+n或者
−
n
-n
−n的操作,此处用insert()方法举例:
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> li;
li.push_back(2);
li.push_back(1);
li.push_back(5);
li.push_front(8);
list<int>::iterator it;
it=li.begin();
li.insert(it++,20); //这样不会报错
//li.insert(it+2,20); //错误的写法
it++;
for(it=li.begin();it!=li.end();it++)
cout<<*it<<" ";
cout<<endl;
return 0;
}
- sort函数与find函数
在c++的list集合里,对list集合的元素排序的时候不是像其他元素一样调用algorithm头文件的sort函数,而是调用list自己的sort函数,而find相反,list自己没有find函数,需要调用algorithm头文件的find函数。具体实例代码如下:
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
list<int> li;
li.push_back(2);
li.push_back(1);
li.push_back(5);
li.push_front(8);
li.push_front(2);
list<int>::iterator it;
it=li.begin();
li.insert(it++,20);
it++;
for(it=li.begin();it!=li.end();it++)
cout<<*it<<" ";
cout<<endl;
li.sort();
//sort(li.begin(),li.end());这是错误的方式
for(it=li.begin();it!=li.end();it++)
cout<<*it<<" ";
cout<<endl;
it = find(li.begin(),li.end(),2);
//li.find(2); 错误的方式
if(it!=li.end())
cout<<*it<<endl;
else
cout<<"no found it"<<endl;
return 0;
}
六、priority_queue
- 通过重载
"
(
)
"
"()"
"()"操作符来定义优先级,通过这种方式进行比较的优先队列初始化时需要传三个参数,分别是:元素类型,内部结构,比较函数。实例如下:
#include <iostream>
#include <queue>
using namespace std;
struct myComp
{
bool operator()(const int &a,const int &b)
{
return a>b;
}
};
int main()
{
//在这里myComp必须在第三个参数传入,所以需要把第二个参数也写上,第二个参数代表的是内部结构
priority_queue<int,vector<int>,myComp> pq2;
pq2.push(1);
pq2.push(9);
pq2.push(2);
pq2.push(30);
while(pq2.empty()!=true)
{
cout<<pq2.top()<<" ";
pq2.pop();
}
cout<<endl;
return 0;
}