一、顺序容器操作1
1.容器的定义和类型别名
2.begin和end成员(这两个成员返回的都是迭代器类型)
顺序容器三种:
vector
list
deque
这三种顺序容器的操作方式是一致的。
#include <iostream>
#include <vector>
#include <list>
#include <deque>
using namespace std;
int main()
{
vector<int> a;
const vector<int> ca; //const容器不能被修改和添加数据
list<int> b;
deque<int> c;
a.push_back(10);
a.push_back(20);
a.push_back(30);
b.push_back(100);
b.push_back(200);
b.push_back(300);
c.push_back(1);
c.push_back(2);
c.push_back(3);
for (vector<int>::size_type i = 0; i < a.size(); ++i)
cout << a[i] << endl;
//报错,list链表中没有下标
/*for (list<int>::size_type j = 0; j < b.size(); ++j)
cout << b[j] << endl;*/
for (deque<int>::size_type k = 0; k < c.size(); ++k)
cout << c[k] << endl;
//begin指向容器中的第一个元素
vector<int>::iterator firsta = a.begin();
//end指向容器中的最后一个元素的下一个
vector<int>::iterator lasta = a.end();
cout << "迭代器" << *firsta << endl;
//cout << *lasta << endl; //错误
while (firsta!=lasta)
{
cout << "迭代器循环:" << *firsta << endl;
++firsta;
}
//list和deque也是一样的
vector<int>::reverse_iterator rfirsta = a.rbegin(); //rbegin返回一个逆序迭代器(从最后一个向前进行迭代)
vector<int>::reverse_iterator rlasta = a.rend();
//常迭代器
vector<int>::const_iterator cfirsta = ca.begin();
vector<int>::const_iterator clasta = ca.end();
vector<int>::size_type a1;
vector<int>::iterator a2;
vector<int>::const_iterator a3;//常迭代器,不可以改变
vector<int>::reverse_iterator a4;
vector<int>::const_reverse_iterator a5;
vector<int>::difference_type a6;
list<int>::size_type b1;
list<int>::iterator b2;
list<int>::const_iterator b3;
list<int>::reverse_iterator b4;
list<int>::const_reverse_iterator b5;
list<int>::difference_type b6;
deque<int>::size_type c1;
deque<int>::iterator c2;
deque<int>::const_iterator c3;
deque<int>::reverse_iterator c4;
deque<int>::const_reverse_iterator c5;
deque<int>::difference_type c6;
return 0;
}
二、顺序容器操作2
1.在顺序容器中添加元素
c.push_back(t)
c.push_front(t)
c.insert(p,t) 插入在迭代器的前面
c.insert(p,n,t) 插入在迭代器的前面n个t
c.insert(p,b,e) 把b和e两个迭代器之间的元素插入到,p迭代器的前面
2.容器添加的元素都是副本
3.添加元素可能会使迭代器失效
4.避免存储end操作返回的迭代器
#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <string>
using namespace std;
int main()
{
vector<string> svec;
list<string> slist;
deque<string> sdeq;
svec.push_back("Bill"); //Vector容器只可以单向插入数据
slist.push_back("Bill");
slist.push_front("aaa");
sdeq.push_back("bbb");
sdeq.push_front("ccc");
for (list<string>::iterator iter = slist.begin();
iter != slist.end(); ++iter)
cout << *iter << " ";
cout << endl;
list<string>::iterator it = slist.begin();
cout << *it << endl;
++it;
cout << *it << endl;
//在list链表中插入10个 “hhh”字符串
slist.insert(it, 10,"hhh");
for (list<string>::iterator iter = slist.begin();
iter != slist.end(); ++iter)
cout << *iter << " ";
cout << endl;
//创建一个数组,插入数组中的字符串
string arr[4] = { "ggg","kkk","jjj" };
slist.insert(it, arr + 1, arr + 2);
for (list<string>::iterator iter = slist.begin();
iter != slist.end(); ++iter)
cout << *iter << " ";
cout << endl;
return 0;
}
三、顺序容器操作3
1.关系运算符
2.所有的容器类型都可以使用
3.比较的容器必须具有相同的类型
4.容器的比较是基于容器内元素的比较
5.容器内元素必须有相应的关系运算符
#include <iostream>
#include <vector>
#include <list>
#include <deque>
using namespace std;
int main()
{
vector<int> ivec1;//容器的比较必须是同类型的,比如int和double类型的就不能进行比较;list和vector类型的也不可以比较
vector<int> ivec2;
ivec1.push_back(1);
ivec1.push_back(3);
ivec1.push_back(5);
ivec1.push_back(7);
ivec1.push_back(9);
ivec2.push_back(2);
ivec2.push_back(4);
ivec2.push_back(6);
ivec2.push_back(8);
ivec2.push_back(10);
if (ivec1 > ivec2) //如果容器中的元素数量相同的话,比较每一个元素的大小; 如果容器中的元素数量不同,比较元素的长度。
cout << "ivec2小" << endl;
else if (ivec1 < ivec2)
cout << "ivec1小" << endl;
else
cout << "两个向量相等" << endl;
}
四、顺序容器操作4
1.容器的大小操作
c.size()
c.max_size()
c.empty()
c.resize(n)
c.resize(n,t)
注意:resize操作可能会使迭代器失效
#include <iostream>
#include <vector>
#include <list>
#include <deque>
using namespace std;
int main()
{
//vector和deque容器也是同样的操作
list<int> ilist;
ilist.push_back(10);
ilist.push_back(20);
ilist.push_back(30);
cout << "容器里数据的个数:" << ilist.size() << endl;
list<int>::size_type count = ilist.size();
cout << "容器里数据的个数:" << count << endl;
cout << "容器中最多可以保存数据的个数:" << ilist.max_size() << endl;
if (ilist.empty())
cout << "容器是空的!" << endl;
else
cout << "容器不是空的!" << endl;
ilist.resize(10); //没有数据的话 默认为0
ilist.resize(20, 1);//新增加的数据都为1
for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); ++iter)
cout << *iter << endl;
cout << endl << endl;
ilist.resize(2);//缩小容器的大小
for (list<int>::iterator iter = ilist.begin(); iter != ilist.end(); ++iter)
cout << *iter << endl;
return 0;
}
五、顺序容器操作5
1.访问元素
c.back()
c.front()
c[n]
c.at(n)
注意:c[n]和c.at[n]只适合vector和deque容器,list是链表没有下标,所以list不能使用。
#include <iostream>
#include <vector>
#include <list>
#include <deque>
using namespace std;
int main()
{
vector<int> ivec;
ivec.push_back(10);
ivec.push_back(20);
ivec.push_back(30);
cout << ivec.front() << endl;
cout << ivec.back() << endl;
cout << endl << endl;
vector<int>::reference a = ivec.front(); // ivec.front()返回一个引用类型
vector<int>::reference b = ivec.back();
cout << a << endl;
cout << b << endl;
cout << *ivec.begin() << endl;//利用迭代器输出ivec.front同样的元素
//ivec[]操作如果下标越界,不会抛出异常
cout << ivec[0] << endl;
cout << ivec[1] << endl;
cout << ivec[2] << endl;
//ivec.at()操作如果下标越界 就会抛出异常
cout << ivec.at(0) << endl;
cout << ivec.at(1) << endl;
cout << ivec.at(2) << endl;
return 0;
}
六、顺序容器的操作6
1.删除元素
c.erase(p) //利用迭代器,删除迭代器所指向的元素
c.erase(b,e) //两个迭代器的之间的元素,但是包括前方的不包括后方的
c.clear() //全部删除
c.pop_back() //最后一个删除
c.pop_front() //前面第一个删除
注意:c.pop_front()只适用于list和deque容器
#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
list<string> slist;
slist.push_back("aaa");
slist.push_back("bbb");
slist.push_back("ccc");
slist.push_back("ddd");
slist.push_back("eee");
slist.push_back("fff");
slist.pop_front();//删除链表中第一个和最后一个
slist.pop_back();
string s1("ccc");
string s2("eee");
list<string>::iterator iter1 = find(slist.begin(), slist.end(), s1);
list<string>::iterator iter2 = find(slist.begin(), slist.end(), s2);
if (iter1 != slist.end() && iter2 != slist.end())
slist.erase(iter1, iter2); //删除从iter1到iter2迭代器指向的数据,包括iter1但不包括iter2
else
cout << "没找到!" << endl;
//删除链表中的所有元素
slist.clear();
slist.erase(slist.begin(), slist.end());
for (list<string>::iterator iter = slist.begin();
iter != slist.end(); ++iter)
cout << *iter << endl;
return 0;
}
七、顺序容器的操作7
1.赋值与交换(swap)
c1=c2
c1.swap(c2)
c.assign(b,e)
c.assign(n,t)
2.使用assign:类型兼容即可
3.使用swap:类型必须相同
#include <iostream>
#include <vector>
#include <list>
#include <deque>
using namespace std;
int main()
{
vector<int> a;
vector<int> b;
vector<int> c;
a.push_back(10);
a.push_back(20);
a.push_back(30);
a.push_back(40);
b.push_back(100);
b.push_back(200);
b.push_back(300);
c.push_back(1);
c.push_back(2);
c.push_back(3);
c.push_back(4);
c.push_back(5);
c.push_back(6);
a.swap(b);//a容器与b容器交换
for (vector<int>::iterator iter = a.begin();
iter != a.end(); ++iter)
cout << *iter << endl;
a = b;//将b赋值给a,允许不同容器中的,相同元素类型赋值
for(vector<int>::iterator iter=a.begin();
iter!=a.end();++iter)
cout << *iter << endl;
vector<int>::iterator f = c.begin();
++f;
++f;
vector<int>::iterator e = c.end();
--e;
a.assign(f, e);
for (vector<int>::iterator iter = a.begin();
iter != a.end(); ++iter)
cout << *iter << endl;
return 0;
}