vector

1.声明:
一个vector类似于一个动态的一维数组。
vector<int> a;   //声明一个元素为int类型的vector a
vectot<MyType> a;   //声明一个元素为MyType类型的vector a
这里的声明的a包含0个元素,既a.size()的值为0,但它是动态的,其大小会随着数据的插入
和删除改变而改变。
vector<int> a(100, 0); //这里声明的是一已经个存放了100个0的整数vector
2.向量操作
常用函数:
size_t size();             // 返回vector的大小,即包含的元素个数
void pop_back();           // 删除vector末尾的元素,vector大小相应减一
void push_back();          // 用于在vector的末尾添加元素
T back();                  // 返回vector末尾的元素
void clear();              // 将vector清空,vector大小变为0
其他访问方式:
cout<<a[5]<<endl;
cout<<a.at(5)<<endl;
以上区别在于后者在访问越界时会抛出异常,而前者不会。

3.遍历
for(vector<datatype>::iterator it=a.begin(); it!=a.end();it++)
 cout<<*it<<endl;
for(int i=0;i<a.size;i++)
 cout<<a[i]<<endl;
例:

#include <string>
#include <iostream>
#include <vector>
using namespace std;
int         	intarray[10];   
vector<int>     first_vector(intarray, intarray + 10);   
vector<int>     second_vector(first_vector.begin(),first_vector.end());
class  man   
{   
public:   
	string    id;   
	string    name;   
};   
int main()
{
	vector<man>  manList;   
	man         thisman;   
	thisman.id="2001";   
	thisman.name="yourname";   
	manList.push_back(thisman);   //加入一个元素     
	manList.clear();           	 //清空 
	return 0;
}

vector<struct>使用

#include <iostream>
#include <vector>
#include <string>
using namespace std;

struct NODE
{
	int m_nRoleID;
	int m_nScore;
	string m_strROleName;
	NODE() :
	m_nRoleID(1), m_nScore(0),m_strROleName("byfei")
	{
	}
	NODE(const int nRoleID, const int nScore,const string strRoleName) :
	m_nRoleID(nRoleID), m_nScore(nScore),m_strROleName(strRoleName)
	{
	}
};

void main()
{
	vector<NODE> v;
	for (int i = 0; i < 10; i++)
		v.push_back(NODE());
	for (int i = 0; i < v.size(); i++)
	{
		v[i].m_nRoleID = 2;
		v[i].m_nScore = 1;
		v[i].m_strROleName = "byf";
		cout<< v[i].m_nRoleID << " " << v[i].m_nScore <<" "<< v[i].m_strROleName << endl;
	}
	system("pause");
}


 vector复制可以直接等于

#include <vector>

using namespace std;

void main()
{
	vector<int> test01;
	test01.push_back(2);
	vector<int> test02 = test01;
	printf("%d\n%d\n",test02.size(),test02[0]);
	test02.push_back(3);
	printf("%d\n",test01.size());
	test01 = test02;
	printf("%d\n",test01.size());
	system("pause");
}

Vector 二维数组

#include <vector>
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
	int N = 2, M = 3;
	vector<vector<int> > Matrix(N, vector<int> (M, 0));
	ostream_iterator<int> os(cout, " ");
	Matrix[0][2] = 4;
	//交换矩阵的两行
	Matrix[0].swap(Matrix[1]);
	//交换矩阵第二行的两个元素
	swap(Matrix[1][0], Matrix[1][2]);
	for (int i = 0; i < Matrix.size(); i++)
	{
		copy(Matrix[i].begin(), Matrix[i].end(), os);
		cout << endl;
	}
	system("pause");
	return EXIT_SUCCESS;
}
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
int main()
{
	int i, j;
	//注意下面这一行:vector<int后两个">"之间要有空格!否则会被认为是重载">>"。
	vector<vector<int> > vecInt(5, vector<int> (5,1));
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
			cout <<vecInt[i][j];
		cout << endl;
	}
	system("pause");
	return 0;
}

当执行大数据量的调用push_back()的时候,记住要调用vector::reserve()。
研究了vector和deque在插入数据的情况。通过这些假设,我们可以看出deque分配的空间是预先分配好的,deque维持一个固定增长率,在vector实验中我们考虑到应该调用vecor::reserve().然后在下面这个例子验证了我们的假设,在使用vector的时候调用reserve()能够膀子我们预先分配空间,这将是vector一个默认选择的操作。
当你分配很多内存单元的时候,记住使用deque回收内存要比vector消耗时间多。
探讨了vector和deque在回收非邻接内存块上的不同,分别证明了vector在分配内存的时候是线性增长,而deque是指数增长,同样,vector要回收的内存比deque多的多,如果你循环调用了push_back(),那么deque将获取大量的内存,而且是临近的。我们通过测试发现在分配内存单元消耗的时间和vector的时间接近。
如果你计划使用insert(),或者需要pop_front(),那就使用deque。
由于vector没有提供pop_front()函数,但在实验四的结果中可以看出没有insert()是非常好的,同时也告诉我们为什么deque在STL类中要作为单独的一个类划分出来。
对于访问数据,vector::at()效率最高。
统计的数据表示,所有访问数据方法的效率是非常接近的,但是vector::at()效率最高。这是因为最优的平衡图访问时间为最低的六个西格玛值。
vector适用:对象数量变化少,简单对象,随机访问元素频繁
list适用:对象数量变化大,对象复杂,插入和删除频繁

vector 删除元素

#include<iostream>
#include <vector>
using namespace  std;

int main( )
{  
	vector<int>test;
	test.push_back(100);
	test.push_back(200);
	test.push_back(300);
	cout<<test[1]<<endl;
	vector<int>::iterator itr= test.begin();
	itr+=1;
	test.erase(itr);
	cout<<test[1]<<endl;
	system("pause");
	return 0;
}


 



 

 

原文地址:https://www.cnblogs.com/byfei/p/14104753.html