vector对象的定义和初始化

时间:2021-12-31 14:15:57

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


vector对象的定义和初始化

在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),这样就降序排序。