C++中vector、queue、stack

 转: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;
}

猜你喜欢

转载自blog.csdn.net/reasonyuanrobot/article/details/83933706
今日推荐