转:https://blog.csdn.net/u011939755/article/details/80572846
1.vector
1.1简介
vector可以看成是一种可以存放各种类型对象的容器,简单地说,vector是一个能够存放任意类型的动态数组。
1.2注意事项
(1)如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;
(2)Vector作为函数的参数或者返回值时,需要注意它的写法。
1.3测试代码
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
//创建vector
cout << "**********赋值**********" << endl;
vector<int> v1;//不带初始
cout << boolalpha << v1.empty() << endl;//判断是否为空
cout << v1.size() << endl;//结果为0
vector<int> v2(3, 0);//初始3个值,都为0
for (vector<int>::iterator iter = v2.begin(); iter != v2.end(); iter++)
{
cout << *iter<<" ";
}
cout << endl;
//查看vector占用空间
cout << "********占用空间********" << endl;
/*
注意
1.size是当前vector容器真实占用的大小,也就是容器当前拥有多少个容器。
2.capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间。
3.这两个属性分别对应两个方法:resize()和reserve()。
4.使用reserve()仅仅只是修改了capacity的值,容器内的对象并没有真实的内存空间(空间是"野"的)。
5.此时切记使用[]操作符访问容器内的对象,很可能出现数组越界的问题。
*/
vector<int> v3;
cout << "v.size() == " << v3.size() << " v.capacity() = " << v3.capacity() << endl;//0,0:初始化,容器没有对象,也没有预留内存空间
v3.reserve(10);
cout << "v.size() == " << v3.size() << " v.capacity() = " << v3.capacity() << endl;//0,10:预留10个对象的空间,但是容器内并没有对象,直接[]访问会造成越界错误
v3.resize(10);
v3.push_back(0);
cout << "v.size() == " << v3.size() << " v.capacity() = " << v3.capacity() << endl;//11,15:size=capacity后,在push一个对象,要重新分配一部分内存空间,至于重新分配多少,不同库有不同实现,这里增加了原先大小的一半
//插入元素
cout << "********插入元素********" << endl;
vector<int> v4;
v4.push_back(1);//尾部插入
for (vector<int>::iterator iter = v4.begin(); iter != v4.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
v4.insert(v4.begin(), 0);//指定位置插入
v4.insert(v4.begin(), 4, 3);//指定位置插入4个3
for (vector<int>::iterator iter = v4.begin(); iter != v4.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
v4.insert(v4.end(),v4.begin(), v4.end());;//连接两个v4
for (vector<int>::iterator iter = v4.begin(); iter != v4.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
//删除元素
cout << "********删除元素********" << endl;
v4.erase(v4.begin());//删除指定位置元素
v4.erase(v4.begin(), v4.end());//指定删除区间
cout << v4.size() << endl;
v4.clear();//清空
//访问
cout << "********访问元素********" << endl;
vector<int> v5;
v5.push_back(0);
cout << v5[0] << endl;//A
cout << v5.at(0) << endl;//B
// 如果v5非空,A行和B行没有任何区别。如果v为空,B行会抛出std::out_of_range异常,A行的行为未定义。如果需要进行下标检查,使用at
//assign分配
cout << "******验证assign******" << endl;
vector<int> v6(4, 0);
vector<int> v7;
v7.assign(3, 4);//指定分配
for (vector<int>::iterator iter = v7.begin(); iter != v7.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
v7.assign(v6.begin(), v6.end());//用另一个vector进行分配
for (vector<int>::iterator iter = v7.begin(); iter != v7.end(); iter++)
{
cout << *iter <<" ";
}
cout << endl;
//算法
vector<int> v8;
v8.push_back(1);
v8.push_back(5);
v8.push_back(4);
v8.push_back(2);
v8.push_back(3);
for (vector<int>::iterator iter = v8.begin(); iter != v8.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
reverse(v8.begin(), v8.end());//逆序,需要#include<algorithm>
for (vector<int>::iterator iter = v8.begin(); iter != v8.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
sort(v8.begin(), v8.end()); //升序
for (vector<int>::iterator iter = v8.begin(); iter != v8.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
//定义排序比较函数,可进行降序排序
bool comp(const int &a, const int &b);
sort(v8.begin(), v8.end(),comp); //降序
for (vector<int>::iterator iter = v8.begin(); iter != v8.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
//二维数组
cout << "********二维数组********" << endl;
vector<vector<int>> v9;
vector<int> v9_0(3, 4);
vector<int> v9_1(3, 6);
v9.push_back(v9_0);
v9.push_back(v9_1);
for (int i = 0; i < v9.size();i++)
{
for (int j = 0; j < v9[0].size();j++)
cout << v9[i][j]<< " ";
cout << endl;
}
cout << endl;
system("pause");
}
bool comp(const int &a, const int &b)
{
return a > b;
}
2.queue
2.1简介
queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。
2.2基本操作
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()
2.3使用
#include<queue>
#include<iostream>
using namespace std;
int main()
{
int e;
queue < int > q1;
for (int i = 0; i<10; i++)
q1.push(i);
for (int i = 0; i < q1.size(); i++)
{
e = q1.front();//取第一个元素
cout << e << " ";
q1.pop();//没有返回值
q1.push(e);//再从后面加进去
}
cout << endl;
cout <<"queue empty?"<< boolalpha<<q1.empty()<<endl;
cout << "queue size:"<<q1.size() << endl;
cout << "queue front:" << q1.front() << endl;
cout << "queue back:" << q1.back() << endl;
system("pause");
}
3.stack
3.1简介
先进后出
3.2基本操作
empty() 堆栈为空则返回真
pop() 移除栈顶元素(不会返回栈顶元素的值)
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素
3.3使用
#include <iostream>
# include <stack>
using namespace std;
void reverseStack(stack <int> &s);
void printStack(stack<int> &st);
void main()
{
stack<int> st;
// 产生一个堆栈st,由下至上的元素分别为0,1,2,3,4,
cout << "入栈:";
for (int i = 0; i <5; i++)
{
st.push(i);
cout << i << " ";
}
cout << endl;
//反转
// 依次弹出堆栈中的元素并显示,分别为4,3,2,1,0
cout << "出栈:";
printStack(st);
cout << "入栈:";
for (int i = 0; i <5; i++)
{
st.push(i);
cout << i << " ";
}
cout << endl;
reverseStack(st);
cout << "反转:";
printStack(st);
system("pause");
}
void reverseStack(stack <int> &s)
{
// 首先处理递归的的停止条件,及堆栈中只有一个元素的情况
if (s.empty())
return;
else {
//如果s里面只有一个元素,就返回,否则就不返回。
//具体实现是先pop出来一个,判断剩下的是不是空栈。
int a = s.top();
s.pop();
if (s.empty()){
s.push(a);
return;
}
else{
s.push(a);
}
}
// 其他情况
int temp1 = s.top();
s.pop();
reverseStack(s);
int temp2 = s.top();
s.pop();
reverseStack(s);
s.push(temp1);
reverseStack(s);
s.push(temp2);
}
void printStack(stack<int> &st)
{
while (!st.empty())
{
cout << st.top() << " ";
st.pop();
}
cout << endl;
}