目录
vector容器
vector对象的默认构造
vector的初始化
vector的遍历
vector的增删改查
vector末尾的添加移除操作
vector的数据存取
deque容器
deque对象的默认构造
deque末尾的添加移除操作
deque的数据存取
stack容器
stack对象的默认构造
stack的push()与pop()方法
stack对象的拷贝构造与赋值
stack的遍历
queue容器
queue容器的初始化及遍历
list容器
list头尾的添加移除操作
list的数据存取
list的插入
list的删除
序列式容器(Sequence containers)在c++中主要有三种:vector、deque、list 。
vector容器
- vector是将元素置于一个动态数组中加以管理的容器。
- vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法)。
vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时。
vector对象的默认构造
vector采用模板类实现,vector对象的默认构造形式
vector<T> vecT;
vector<int> vecInt; //一个存放int的vector容器。
vector<float> vecFloat; //一个存放float的vector容器。
vector<string> vecString; //一个存放string的vector容器。
... //尖括号内还可以设置指针类型或自定义类型。
Class CA{};
vector<CA*> vecpCA; //用于存放CA对象的指针的vector容器。
vector<CA> vecCA; //用于存放CA对象的vector容器。由于容器元素的存放是按值复制的方式进行的,所以此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常。
vector的初始化
//vector的初始化
void main32()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
vector<int> v2 = v1;
vector<int> v3(v1.begin(), v1.begin() + 2);
}
vector的遍历
主要有两种方式,数组方式遍历和迭代器方式的遍历。
void printV(vector<int>& v)
{
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
void main35()
{
vector<int> v1(10);
for (int i = 0; i < 10; i++)
{
v1[i] = i + 1;
}
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
//逆向遍历
for (vector<int>::reverse_iterator rit = v1.rbegin();rit != v1.rend(); rit++)
{
cout << *rit << " ";
}
}
vector的增删改查
vector末尾的添加移除操作
vector<int> vecInt;
vecInt.push_back(1); //在容器尾部加入一个元素
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);
vecInt.pop_back(); //移除容器中最后一个元素
vecInt.pop_back();
//{5 ,7 ,9}
vector的数据存取
vec.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
vec[idx]; //返回索引idx所指的数据,越界时,运行直接报错
vector<int> vecInt; //假设包含1 ,3 ,5 ,7 ,9
vecInt.at(2) == vecInt[2] ; //5
vecInt.at(2) = 8; 或 vecInt[2] = 8;
vecInt 就包含 1, 3, 8, 7, 9值
int iF = vector.front(); //iF==1
int iB = vector.back(); //iB==9
vector.front() = 11; //vecInt包含{11,3,8,7,9}
vector.back() = 19; //vecInt包含{11,3,8,7,19}
//vector 删除
void main36()
{
vector<int> v1(10);
for (int i = 0; i < 10; i++)
{
v1[i] = i + 1;
}
//区间删除
v1.erase(v1.begin(), v1.begin() + 3);
printV(v1);
//根据元素的位置删除
v1.erase(v1.begin());
printV(v1);
//根据元素的值
v1[1] = 2;
v1[3] = 2;
printV(v1);
for (vector<int>::iterator it = v1.begin(); it != v1.end();)
{
if (*it == 2)
{
it = v1.erase(it);//当删除迭代器所指向的元素的时候,erease删除函数会让it自动下移动
}
else
{
it++;
}
}
printV(v1);
v1.insert(v1.begin(), 100);
v1.insert(v1.end(), 200);
printV(v1);
}
deque容器
- deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。
- deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
- deque可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。
- deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。
deque对象的默认构造
deque采用模板类实现,deque对象的默认构造形式:deque<T> deqT;
deque <int> deqInt; //一个存放int的deque容器。
deque <float> deq Float; //一个存放float的deque容器。
deque <string> deq String; //一个存放string的deque容器。
//尖括号内还可以设置指针类型或自定义类型。
deque末尾的添加移除操作
- deque.push_back(elem); //在容器尾部添加一个数据
- deque.push_front(elem); //在容器头部插入一个数据
- deque.pop_back(); //删除容器最后一个数据
- deque.pop_front(); //删除容器第一个数
deque的数据存取
- deque.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range。
- deque[idx]; //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
- deque.front(); //返回第一个数据。
- deque.back(); //返回最后一个数据
void main41()
{
deque<int> d1;
d1.push_back(1);
d1.push_back(3);
d1.push_back(5);
d1.push_front(-11);
d1.push_front(-33);
d1.push_front(-55);
printD(d1);
cout << endl;
cout << "头部元素:" << d1.front() << endl;
cout << "尾部元素:" << d1.back() << endl;
d1.pop_front();
d1.pop_back();
printD(d1);
cout << endl;
//查找-33在数组下标的值
deque<int>::iterator it = find(d1.begin(), d1.end(), -33);
if (it != d1.end())
{
cout << "-33数组下标是" << distance(d1.begin(), it) << endl;
}
else
{
cout << "没有找到值为-33的元素" << endl;
}
}
stack容器
- stack是堆栈容器,是一种“先进后出”的容器。
- stack是简单地装饰deque容器而成为另外的一种容器。
stack对象的默认构造
stack采用模板类实现, stack对象的默认构造形式: stack <T> stkT;
stack <int> stkInt; //一个存放int的stack容器。
stack <float> stkFloat; //一个存放float的stack容器。
stack <string> stkString; //一个存放string的stack容器。
//尖括号内还可以设置指针类型或自定义类型。
//栈模型
//栈的算法和栈容器数据类型的分离
void main51()
{
stack<int> s;
//入栈
for (int i = 0; i < 10; i++)
{
s.push(i + 1);
}
cout << "栈的大小" << s.size() << endl;
//出栈
while (!s.empty())
{
//获取栈顶元素
int tmp = s.top();
cout << tmp << " ";
s.pop();//弹出栈顶元素
}
}
stack的push()与pop()方法
stack.push(elem); //往栈头添加元素
stack.pop(); //从栈头移除第一个元素
stack对象的拷贝构造与赋值
stack(const stack &stk); //拷贝构造函数
stack& operator=(const stack &stk); //重载等号操作符
stack的遍历
void main52()
{
Teacher5 t1, t2, t3;
t1.age = 31;
t2.age = 32;
t3.age = 33;
stack<Teacher5> s;
s.push(t1);
s.push(t2);
s.push(t3);
while (!s.empty())
{
Teacher5 tmp = s.top();
tmp.prinT();
s.pop();
}
}
queue容器
- queue是队列容器,是一种“先进先出”的容器。
- queue是简单地装饰deque容器而成为另外的一种容器。
queue采用模板类实现,queue对象的默认构造形式:queue<T> queT; 如:
queue<int> queInt; //一个存放int的queue容器。
queue<float> queFloat; //一个存放float的queue容器。
queue<string> queString; //一个存放string的queue容器。
//尖括号内还可以设置指针类型或自定义类型。
queue容器的初始化及遍历
//队列中基本数据类型
void main61()
{
queue<int> q;
q.push(1);
q.push(2);
q.push(3);
cout << "队头元素" << q.front() << endl;
cout << "队列的大小" << q.size() << endl;
while (!q.empty())
{
int tmp = q.front();
cout << tmp << " ";
q.pop();
}
}
list容器
- list是一个双向链表容器,可高效地进行插入删除元素。
- list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。It++(ok) it+5(err)
list采用采用模板类实现,对象的默认构造形式:list<T> lstT; 如:
list<int> lstInt; //定义一个存放int的list容器。
list<float> lstFloat; //定义一个存放float的list容器。
list<string> lstString; //定义一个存放string的list容器。
//尖括号内还可以设置指针类型或自定义类型。
list头尾的添加移除操作
- list.push_back(elem); //在容器尾部加入一个元素
- list.pop_back(); //删除容器中最后一个元素
- list.push_front(elem); //在容器开头插入一个元素
- list.pop_front(); //从容器开头移除第一个元素
list的数据存取
- list.front(); //返回第一个元素。
- list.back(); //返回最后一个元素。
void main71()
{
list<int> l;
cout << "list的大小:" << l.size() << endl;
for (int i = 0; i < 10; i++)
{
l.push_back(i);//尾部插入元素 尾插法
}
cout << "list的大小:" << l.size() << endl;
list<int>::iterator it = l.begin();
while (it != l.end())
{
cout << *it << " ";
it++;
}
cout << endl;
//lsit不能随机访问
it = l.begin();
it++;
it++;
it++;
//it += 5; 不支持随机的访问容器
l.insert(it, 100);//100插入在什么位置
for (list<int>::iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}
//结论1:链表的结点的index序号是从0号位置开始
//结论2:在3号位置插入元素,是让原来的3号位置变成4号位置 原来的4号位置变成5号位置
}
list的插入
- list.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
- list.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
- list.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
list的删除
- list.clear(); //移除容器的所有数据
- list.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
- list.erase(pos); //删除pos位置的数据,返回下一个数据的位置。
lst.remove(elem); //删除容器中所有与elem值匹配的元素
//list删除
void main72()
{
list<int> l;
cout << "list的大小:" << l.size() << endl;
for (int i = 0; i < 10; i++)
{
l.push_back(i);//尾部插入元素 尾插法
}
cout << "list的大小:" << l.size() << endl;
list<int>::iterator it = l.begin();
while (it != l.end())
{
cout << *it << " ";
it++;
}
cout << endl;
list<int>::iterator it1 = l.begin();
list<int>::iterator it2 = l.begin();
it2++;
it2++;
it2++;
l.erase(it1, it2);
it = l.begin();
while (it != l.end())
{
cout << *it << " ";
it++;
}
cout << endl;
l.insert(l.begin(), 100);
l.insert(l.begin(), 100);
l.insert(l.begin(), 100);
it = l.begin();
while (it != l.end())
{
cout << *it << " ";
it++;
}
cout << endl;
l.erase(l.begin());
it = l.begin();
while (it != l.end())
{
cout << *it << " ";
it++;
}
cout << endl;
l.remove(100);
it = l.begin();
while (it != l.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}