一、顺序容器的定义
1.顺序容器
vector
list
deque
2.顺序容器适配器
stack
queue
priority_queue
#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include "Cat.h"
#include "Dog.h"
using namespace std;
int main()
{
//顺序容器中的保存类型是非常灵活的
vector<string> svec;//默认的构造函数
svec.push_back("hello");
svec.push_back("C++");
svec.push_back("STL");
list<int> ilist;
vector<Dog> dogvec;//容器中也可以存放自己声明的Dog类,容器中的模板参数各种各样的类型都可以
list<Cat> catlist;
vector<int> ivec;//默认的构造函数
ivec.push_back(1);
ivec.push_back(2);
ivec.push_back(3);
vector<int> ivec2(ivec);//有参数的构造函数,利用第一个向量里的数据初始化第二个向量
//list<int> ilist(ivec); //错误 ivec vector类型的容器,不能初始化list类型的容器
list<string> slist(svec.begin(), svec.end());
vector<string>::iterator mid = svec.begin() + svec.size() / 2;
deque<string> front(svec.begin(), mid);
deque<string> back(mid, svec.end());
return 0;
}
二、迭代器和迭代范围
1.每一种容器都有自己的迭代器,所有的迭代器接口都是一样的
2.在整个标准库中,经常使用形参为一对迭代器的构造函数
3.常用的迭代器操作
*iter、++iter、–iter、iter1==iter2、iter1!=iter2
4.vector和deque容器的迭代器的额外操作
iter+n、iter-n、>、>=、<、<=
5.迭代器的范围
begin/end、first/last
6.使迭代器失效的容器操作
#include <iostream>
#include <vector>
#include <deque>
#include <list>
using namespace std;
int main()
{
vector<int> a;
deque<int> b;
list<int> c;
a.push_back(10);
a.push_back(20);
a.push_back(30);
a.push_back(40);
a.push_back(50);
vector<int>::iterator iter1 = a.begin();
vector<int>::iterator iter2 = a.end();//end()是指向容器中最后一个元素的下一个
cout << *iter1 << endl;
iter1++;
cout << *iter1 << endl;
iter1++;
cout << *iter1 << endl;
iter1--;
cout << *iter1 << endl;
vector<int>::iterator first = a.begin();
vector<int>::iterator last = a.end();
while (first!=last)
{
cout << *first << endl;
first++;
}
vector<int>::iterator x = a.begin();
vector<int>::iterator m = x + a.size() / 2;//中间元素数据的指针
cout << "中间:" << *m << endl;
return 0;
}
7.编写一个函数,其形参是一对迭代器和一个int类型的数值,实现在迭代器标记的范围内寻找这个int类型的数值,并返回一个bool值表示是否能找到。
#include <iostream>
#include <vector>
using namespace std;
bool findInt(vector<int>::iterator beg, vector<int>::iterator end, int ival);
int main()
{
vector<int> a;
a.push_back(2);
a.push_back(9);
a.push_back(12);
a.push_back(7);
a.push_back(28);
vector<int>::iterator k = a.end();
bool result = findInt(a.begin(), k, 28);
if (result == true)
cout << "找到!" << endl;
else
cout << "没找到!" << endl;
return 0;
}
//从beg---end范围内找ival这个值,前包后不包,end迭代器是指向容器中最后一个元素的 下一个空位置
bool findInt(vector<int>::iterator beg,
vector<int>::iterator end, int ival)
{
while (beg!=end)
{
if (*beg == ival)
break;
else
++beg;
}
if (beg != end)
return true;
else
return false;
}
8.重写7的程序,查找元素的值的值,并返回元素的迭代器
#include <iostream>
#include <vector>
using namespace std;
vector<int>::iterator findInt(vector<int>::iterator beg,
vector<int>::iterator end, int ival)
{
while (beg!=end)
{
if (*beg == ival)
break;
else
++beg;
return beg;
}
}
int main()
{
int ia[] = { 0,1,2,3,4,5,6 };
vector<int> ivec(ia, ia + 7);
vector<int>::iterator result = findInt(ivec.begin(), ivec.end(), 5);
if (result == ivec.end())
cout << "没找到!" << endl;
else
cout << "找到了!" << endl;
return 0;
}
9.使用迭代器编写程序,从标准输入设备输入若干个string类型,并且把他们存放到同一个Vector对象中,输出Vector对象中的所有元素。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> svec;
string str;
cout << "Enter some strings(Ctrl+Z to end):" << endl;
while (cin>>str)
{
svec.push_back(str);
}
for (vector<string>::iterator iter = svec.begin(); iter != svec.end(); ++iter)
cout << *iter << endl;
return 0;
}
10.重新写9,用list容器
#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std;
int main()
{
//vector<string> svec;
list<string> slst;
string str;
cout << "Enter some strings(Ctrl+Z to end):" << endl;
while (cin >> str)
{
//svec.push_back(str);
slst.push_back(str);
}
//for (vector<string>::iterator iter = svec.begin(); iter != svec.end(); ++iter)
// cout << *iter << endl;
for (list<string>::iterator iter = slst.begin();
iter!=slst.end(); ++iter)
cout << *iter << endl;
return 0;
}