一.迭代器
迭代器是容器与算法的连接通道,迭代器对存在容器中的元素序列进行便利,提供访问容器中每个元素的方法,类似于指针,指针也是迭代器的一种,所以迭代器有着类似于指针的用法,但是迭代更抽象,不是具体内存中的物理位置,而是容器中的逻辑位置。
int* p;
vctor<int>::iterator pp;
*p;//取得p所指内存空间的内容
*pp; //取得pp指向容器位置的内容
p++;//p后移一位
pp++; //pp指向后徐磊后一个
迭代器 的种类:
输入迭代器,可以向序列中读入数据:istream_iterator 输出迭代器,可以向序列中写入数据:ostream_iterator
示例:
double square(double t)
{
return t*t;
}
int main()
{
transform(istream_iterator<double>(cin), istream_iterator<double>(), ostream_iterator<double>(cout, " "), square);//调用普通函数不用加(),调用函数对象要加()
cout << endl;return 0; }
前向迭代器:既可以输入也可以输出,并且可以对序列进行单项的遍历
双向迭代器:既可以向前遍历,也可以向后遍历
随机访问迭代器:能够在序列中任意两个位置之间进行跳转,如指针、vector的begin()和end()
int main()
{
int myints[7] = { 1, 2, 3, 4, 5, 7, 6 };
transform(myints, myints+7, ostream_iterator<double>(cout, " "), square);
cout << endl;
system("pause");
return 0;
}
void advance(iterator pos,int n)//对pos进行n次自加
int distance(iterator first,iterator last) //距离,也就是两个参数之间需要的++次数
find(iterator fist,iterator last,i) //在first与last这段内容中找到i的位置并返回
int main()
{
list<int>coll;
for (int i = 1; i <= 9; i++)
{
coll.push_back(i);//在coll中放入1-9九个数
}
list<int>::iterator pos = coll.begin();//定义迭代器指向容器的begin;
advance(pos, 2);//pos自加两次
cout << "pos->value is " << *pos << endl;//输出3
pos = find(coll.begin(), coll.end(), 5);//使pos指向5的地方
if (pos != coll.end())
{
cout << distance(coll.begin(), pos) << endl;计算5到最后的距离
}
system("pause");
return 0;
}
二.容器
容器是包含一组元素或元素集合的对象。
七大基本容器:vector向量,deque双端队列,list列表(链表),set集合,multiset多重集合,map映射,multimap多重映射
顺序容器:vector向量,deque双端队列,list列表(链表)
关联容器:set集合,multiset多重集合,map映射,multimap多重映射
1.容器通用功能
(1)构造函数构造容器
#include <vector>
#include <deque>
#include <list>
int main()
{
list<int>coll;
vector<int>myvector;
deque<int>deque;
system("pause");
return 0;
}
(2)用begin和end获得容器首尾
int main()
{
list<int>coll;
list<int>::iterator it = coll.begin(); //迭代器获得容器首
system("pause");
return 0;
}
(3)其他功能
empty()返回容器是否为空,clear()使容器清空,size()获得容器中的元素个数,S1.swap(S2)使S1与S2交换,
s[n]获得容器的第n个数据,S::const_iterator是常迭代器,S::iterator是指向容易元素的迭代器.
(4)可逆(双向)容器功能
int main()
{
int myints[7] = { 1,2,3,4,5,6,7};
vector<int>coll(7);
vector<int>::reverse_iterator it = coll.rbegin();//指向容器尾的逆迭代器
copy(myints, myints + 7, coll.begin());
for (; it != coll.rend(); it++)//迭代器从尾部遍历到头部
{
cout << *it ;
}
system("pause");
return 0;
}
(5)顺序容器的通用
/1/构造
vector(6,4); //构造一个由6个4组成的容器
vector(6);//构造一个容量为6的容器
vector(q1,q2);//构造一个由q1和q2之间的元素组成的容器,例如list<int>coll2(coll.begin (),coll.end());
除了构造,也能用vector.assign(6.4);等来直接赋值
/2/插入
coll.insert(coll.begin() + 3, 8); //在距离头3的位置插入8
coll.push_back(8); //在尾部插入8
coll.push_front(8); //在头部插入8,只针对list和deque容器!!
(6)vecor向量
/1/特点
可拓展的动态数组,随机访问,在尾部删除插入数据快,在中间插入删除数据慢
/2/函数
capacity()返回实际分配的空间大小
reserve()分配n的容量空间,使其容量至少为n
const int N = 5;
vector<int> s(2);
vector<int>::iterator *pos = s.begin;
s.reserve(5);
cout << s.capacity() << endl;
cout << s.size() << endl;
(7)deque双端队列
/1/特点:
在两端插入删除数据快,在中间插入删除元素慢,随机访问较快,比vector慢
/2/函数
sort函数用于排序,默认为升序
int myints[8] = { 1,7,3,8,5,6,4};
deque<int>coll(7);
deque<int>::iterator it = coll.begin();
copy(myints, myints + 7, coll.begin());
sort(coll.begin(),coll.end());
(8)list列表
/1/特点
在任意位置删除或插入都很快,不支持随机访问
/2/函数
splice(p,s1,q1,q2); s2中的(q1,q2)移动到s1中p所指元素之前
s1.splice(s1.begin(),s2, s2.begin(), s2.end());
(9)三种容器的选用
如果需要执行大量访问,而且只需向尾部加入新的元素,选用vector;
少量随机访问,两端加入新的元素,选择deque;
不需要对容器进行随机访问,当时需要在中间位置插入或者删除元素,选用list。