vector 的个性:
vector 除了可以使用标准容器共性 和序列式容器共性外 还可以使用如下函数:
当前容量 .capacity(),用于预先分配数组空间,以免多次重新分配空间和复制 // 共性中的.size()表示元素个数
约定容量 .reserve(n)(1)下标 .operator[ ]( i ) 不检查越界 (2) .at( i ) 会先检查越界,越界抛出异常
(注意:不支持前插,插入仅能使用push_back 和 insert)
vector 例子
#include <iostream>
using namespace std;
#include <vector>
#include "show.h"
#include <typeinfo>
#include <exception>
template <typename T>
void print(const vector<vector<T> > &v) //打印二维数组
{
cout << "--------print-------------" << endl;
for(int i=0; i <v.size(); i++)
{
for(int j=0; j < v.at(i).size(); j++)
{
cout << v.at(i).at(j) << ' ';
}
cout << endl;
}
cout << "------------------------" << endl;
}
int main()
{
vector<double> vd,vv,vi;
cout << vd.size() << '/' << vd.capacity() << endl;
cout << "----------------------" << endl;
for(int i = 0; i< 9; i++)
{
vd.push_back(i+0.1);
cout << vd.size() << '/' << vd.capacity() << endl;
}
/*
结果显示:
0/0
----------------------
1/1
2/2
3/4
4/4
5/8
6/8
7/8
8/8
9/16
*/
vv.reserve(9); //如果有大量数据要插入,可以先把空间预留好,以免反复分配空间和复制数据
cout << vv.size() << '/' << vv.capacity() << endl;
cout << "----------------------" << endl;
for(int i = 0; i< 10; i++)
{
vv.push_back(i+0.1);
cout << vv.size() << '/' << vv.capacity() << endl;
}
/*
0/9
----------------------
1/9
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9
10/18
*/
/*vector迭代器重新分配内存后 ,迭代器会失效
所以插入和删除数据后,迭代器要重新去取得*/
cout << "----------------------" << endl;
for(int i = 0; i< 10; i++)
{
vi.push_back(i+0.1);
cout << &*vi.begin() << ": " ;
cout << vi.size() << '/' << vi.capacity() << endl;
}
/*
* 你会发现重新分配内存后 开始位置会变化
0x8886008: 1/1
0x8886018: 2/2
0x8886030: 3/4
0x8886030: 4/4
0x8886058: 5/8
0x8886058: 6/8
0x8886058: 7/8
0x8886058: 8/8
0x8886210: 9/16
0x8886210: 10/16
*/
/*访问元素的值*/
//不做越界检查的 [ ]
for(int i=0; i< vi.size(); i++)
{
cout << vi[i] << ' ';
}
cout << endl;
//做越界检查的访问 at 越界抛出std::out_of_range
try
{
for(int i=0; i<= vi.size(); i++)
{
cout << vi.at(i) << ' ';
}
cout << endl;
}
catch(exception &e)
{
cout << "异常:" << e.what() << endl; //vector::_M_range_check
cout << "类型:" << typeid(e).name() << endl;// St12out_of_range
}
//修改数据
vi[1] = 123.45;
vi.at(2) = 67.8;
show(vi.begin(), vi.end()); //0.1 123.45 67.8 3.1 4.1 5.1 6.1 7.1 8.1 9.1
//序列式容器特有的构造函数
vector<int> vtest(3,4); //3个4
cout << vtest.size() << '/' << vtest.capacity() << endl; // 3/3
show(vtest.begin(), vtest.end());// 4 4 4
vector<int> vtest2(3); //3个0
cout << vtest2.size() << '/' << vtest2.capacity() << endl; // 3/3
show(vtest2.begin(), vtest2.end());// 0 0 0
/*二位数组*/
int m=3,n=5;
// 空格隔开尖括号 否则报错 error: ‘>>’ should be ‘> >’ within a nested template argument list
vector<vector<int> > vvi(m,vector<int>(n)); //m个vector元素,每个vector含5个0
print(vvi);
/*
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
*/
vvi.resize(m+3);//修改元素个数为6个 ,新增的元素是空构造函数
vvi[1].assign(9,1);//将第二个元素设置为9个1
vvi[5].assign(11,1);//将第六个元素设置为11个1
//cout << "-----------" << endl;
/*
for(int i=0;i <m+3;i++)
{
show(vvi[i].begin(),vvi[i].end());
}
*/
print(vvi);
/*
0 0 0 0 0
1 1 1 1 1 1 1 1 1
0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
*/
}