vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>
一、vector对象的定义和初始化
几种初始化vector对象的方式
vector<T> v1; | vector保存类型为T的对象。默认构造函数v1为空。 |
vector<T> v2(v1); | v2是v1的一个副本。 |
vector<T> v3(n, i); | v3包含n个值为i的元素。 |
vector<T> v4(n); | v4含有值初始化的元素的n个副本。 |
1. 创建确定个数的元素
若要创建非空的vector对象,必须给出初始化元素的值。当把一个vector对象复制到另一个vector对象时,新复制的vector中每一个元素都初始化为原vector中相应元素的副本。但这两个vector对象必须保存同一种元素类型:
vector ivec1; // ivec1 holds objects of type int vector ivec2(ivec1); // ok: copy elements of ivec1 into ivec2 vector svec(ivec1); // error: svec holds strings, not ints |
可以用元素个数和元素值对vector对象进行初始化。构造函数用元素个数来决定vector对象保存元素的个数,元素值指定每个元素的初始值:
vector ivec4(10, -1); // 10 elements, each initialized to -1
vector svec(10, "hi!"); // 10 strings, each initialized to "hi!"
|
更有效的方法是先初始化一个空vector对象,然后再动态地增加元素。
2. 值初始化
如果vector保存内置类型(如int类型)的元素,那么标准库将用0值创建元素初始化值:
vector fvec(10); // 10 elements, each initialized to 0 |
如果向量保存类类型(如string)的元素,标准库将用该类型的默认构造函数创建元素初始值:
vector svec(10); // 10 elements, each an empty string |
3、成员函数 如:vector<T>c;
1)c.assign(beg,end) // 将[beg; end)区间中的数据赋值给c ???这句是不是有问题,
c.assign(n,elem) // 将n个elem的拷贝赋值给c。
c.assign(3,2); //将3个int,值 都是2的元素赋值给C
2) c.at(idx) // 传回索引idx所指的数据,如果idx越界,抛出out_of_range。
3) c.back() // 传回最后一个数据,不检查这个数据是否存在。
4) c.begin() // 传回迭代器中的第一个数据地址。
5) c.capacity() // 返回容器中数据个数。
6)c.clear() // 移除容器中所有数据。
7)c.empty() // 判断容器是否为空。
8)c.end() // 指向迭代器中末端元素的下一个,指向一个不存在元素。
9)c.erase(pos) // 删除pos位置的数据,传回下一个数据的位置。
10)c.erase(beg,end) //删除[beg,end)区间的数据,传回下一个数据的位置。
11)c.front() // 传回第一个数据。
12)get_allocator // 使用构造函数返回一个拷贝。
13)c.insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置。
14)c.insert(pos,n,elem) // 在pos位置插入n个elem数据。无返回值。
15)c.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值。
16)c.max_size() // 返回容器中最大数据的数量。
17)c.pop_back() // 删除最后一个数据。
18)c.push_back(elem) // 在尾部加入一个数据。
19)c.rbegin() // 传回一个逆向队列的第一个数据。
20)c.rend() //函数返回指向当前vector起始位置的逆迭代器.
21)c.resize(num,val) // 重新指定队列的长度,且对新创建的元素赋值val。
22)c.reserve() // 保留适当的容量。
23)c.size() // 返回容器中实际数据的个数。
24)c1.swap(c2)
25)swap(c1,c2) // 将c1和c2元素互换。同上操作。
26)operator[] // 返回容器中指定位置的一个引用。
// testtest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <vector>
#include "hongdingyi.h"
using namespace std;
void test_vector_insert( )
{
vector <int> v1;
vector <int>::iterator Iter;
v1.push_back( 10 );
v1.push_back( 20 );
v1.push_back( 30 );
cout << "v1 =" ;
for ( Iter = v1.begin( );Iter != v1.end( ) ; Iter++ )
{
cout << " " << *Iter;
}
cout << endl;
v1.insert( v1.begin( ) + 1, 40 );
cout << "v1 =";
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
{
cout << " " << *Iter;
}
cout << endl;
v1.insert( v1.begin( ) + 2, 4, 50 );
cout << "v1 =";
for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
{
cout << " " << *Iter;
}
cout << endl;
v1.insert( v1.begin( )+1, v1.begin( )+2, v1.begin( )+4 );// 在 v1.begin( )+1 位置插入在[v1.begin( )+2,v1.begin( )+4)区间的数据。无返回值
cout << "v1 =";
for (Iter = v1.begin( ); Iter != v1.end( ); Iter++ )
{
cout << " " << *Iter;
}
cout << endl;
//用下面这种形式也可以的
vector<char> alphaVector;
for (int i=0;i<5;i++)
{
alphaVector.push_back(i+65);
}
vector<char>::iterator theIterator = alphaVector.begin();
alphaVector.insert(theIterator,4,'C');
alphaVector.insert(alphaVector.begin()+2,'1');
for (theIterator=alphaVector.begin();theIterator!=alphaVector.end();theIterator++)
{
cout<<*theIterator<<" ";
}
cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> ::iterator it;
vector<int> vec(5,3);
for (it=vec.begin();it!=vec.end();it++)
{
cout<<*it<<" ";//3 3 3 3 3
}
cout<<endl;
vec.assign(3,2);// 将3个int,值都是2的像素赋值给vec,这里vec以前的像素都被覆盖
for (it=vec.begin();it!=vec.end();it++)
{
cout<<*it<<" ";//结果:2 2 2
}
cout<<endl;
vector<int> v1;
for (int i=1;i<=3;i++)
{
v1.push_back(i);
}
v1.resize(6,8);//第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,即容器大小为6,多出的两个空间都初始化为8
for (it=v1.begin();it!=v1.end();it++)
{
cout<<*it<<" ";//结果:1 2 3 8 8 8
}
cout<<endl;
//下面的for 与上面的for循环功能是一样的,都是显示容器V1中的元素。
for(int i=0;i<v1.size();i++)//resize与reserver并不会删除原先的元素以释放空间
{
cout<<v1[i]<<" ";//结果:1 2 3 8 8 8
}
cout<<endl;
cout <<"v1.size:"<<v1.size()<<endl;//结果:6
v1.reserve(8);//保证vector的空间大小(capacity)最少达到它的参数所指定的大小
cout <<"v1.capacity:"<<v1.capacity()<<endl;//结果:8
vector<int>::reverse_iterator pos;
pos = v1.rend();
pos--;
cout<<*pos<<" ";
pos--;
cout<<*pos<<endl; //上面两个cout 输出 1 2
pos=v1.rbegin();
pos++;
cout<<*pos<<endl;//结果:8
test_vector_insert();//几个insert函数的用法
system("pause");
return 0;
}
在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结。
1 基本操作
(1)头文件#include<vector>.
(2)创建vector对象,vector<int> vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector<int> ::iterator it;
vector<int> vec(3,2);//vec容器里放了3个int元素,值都是2
for (it=vec.begin();it!=vec.end();it++)
{
cout<<*it<<endl;
}
结果是:2
2
2
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear();
2、vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。
3、 算法
(1) 使用reverse将元素翻转:需要头文件#include<algorithm>
reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,一般后一个都不包含.)
(2)使用sort排序:需要头文件#include<algorithm>,
sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).
可以通过重写排序比较函数按照降序比较,如下:
定义排序比较函数:
bool Comp(const int &a,const int &b)
{
return a>b;
}
vector<int> v1;
vector<int> ::iterator it;
for (int i=1;i<=3;i++)
{
v1.push_back(i);
}
sort(v1.begin(),v1.end(),Comp);
for (it=v1.begin();it!=v1.end();it++)
{
cout<<*it<<" ";//结果:3 2 1
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。