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