C++ Vector容器使用方法详解

Vector概述

      C++ 标准库向量类是序列容器的类模板。 向量以线性排列方式存储给定类型的元素,并允许快速随机访问任何元素。 向量是需要力求保证访问性能时的首选序列容器。vector是种容器,类似数组一样,但它的size可以动态改变。vector的元素在内存中连续排列,这一点跟数组一样。这意味着我们元素的索引将非常快,而且也可以通过指针的偏移来获取vector中的元素。但连续排列也带来了弊端,当我们向vector中间插入一个数据时,整个vector的size变大,在内存中就需要重新分配空间,常规的做法是直接申请一个新的array,并将所有元素拷贝过去;但这么做的话,无疑太浪费时间,因此vector采用的做法是:vector会分配额外的空间,以适应size的动态增长。因此,包含同样数量元素的vector和数组相比,占用的空间会更大。而且在vector最后增加或者删除一个元素,消耗的时间是一个常数值,与vector的size无关。与其他容器(deques、lists、forward_lists)相比,vector在获取元素和对最后一个元素的操作效率上更高;

Vector语法

C++

template >
class vector

Vector参数

Type
要存储在矢量中的元素数据类型

Allocator
表示所存储分配器对象的类型,该分配器对象封装有关矢量的内存分配和解除分配的详细信息。 此参数为可选参数,默认值为 allocator

Vector注解

向量允许在序列末尾插入和删除常量事件。 若要在矢量中间插入或删除元素,则需要线性时间。 deque 类容器在序列开头和末尾的插入和删除速度更快。 list 类容器在序列中任何位置的插入和删除速度更快。

当成员函数必须将矢量对象中所含序列增加到超过其当前存储容量时,将进行矢量重新分配。 其他的插入和删除均可能改变序列中的各个存储地址。 在所有此类情况下,指向序列更改部分的迭代器或引用将变为无效。 如果未进行重新分配,则只有插入/删除点前的迭代器和引用保持有效。

vector 类是 bool 类型的元素的类模板向量的完全专用化。 它具有专用化使用的基础类型的分配器。

vector 引用类是一个嵌套类,其对象可以提供对 vector 对象内的元素(单一位)的引用。

Vector成员

构造函数

名称 说明
vector 构造一个向量,它具有特定大小、具有特定值的元素、具有特定 allocator,或将其构造成某个其它向量的副本。

Typedef

名称 说明
[allocator_type](#allocator_type) 一个类型,它表示矢量对象的 allocator 类。
const_iterator 一个类型,它提供可读取矢量中 const 元素的随机访问迭代器。
const_pointer 一个类型,它提供指向矢量中 const 元素的指针。
const_reference 一个类型,它提供对向量中存储的 const 元素的引用。 它用于读取和执行 const 操作。
const_reverse_iterator 一个类型,它提供可读取矢量中任何 const 元素的随机访问迭代器。
difference_type 一个类型,它提供矢量中两个元素的址间的差异。
iterator 一个类型,它提供可读取或修改向量中任何元素的随机访问迭代器。
pointer 一个类型,提供指向向量中元素的指针。
reference 一个类型,它提供对向量中存储的元素的引用。
reverse_iterator 一个类型,它提供可读取或修改反向矢量中的任意元素的随机访问迭代器。
size_type 一个类型,它计算矢量中的元素数目。
value_type 一个类型,它代表向量中存储的数据类型。

函数

名称 说明
assign 清除矢量并将指定的元素复制到该空矢量。
at 返回对矢量中指定位置的元素的引用。
back 返回对向量中最后一个元素的引用。
begin 对该向量中第一个元素返回随机访问迭代器。
capacity 返回在不分配更多的存储的情况下向量可以包含的元素数。
cbegin 返回指向向量中第一个元素的随机访问常量迭代器。
cend 返回一个随机访问常量迭代器,它指向刚超过矢量末尾的位置。
crbegin 返回一个指向反向矢量中第一个元素的常量迭代器。
crend 返回一个指向反向矢量末尾的常量迭代器。
clear 清除向量的元素。
data 返回指向向量中第一个元素的指针。
emplace 将就地构造的元素插入到指定位置的向量中。
emplace_back 将一个就地构造的元素添加到向量末尾。
empty 测试矢量容器是否为空。
end 返回指向矢量末尾的随机访问迭代器。
erase 从指定位置删除向量中的一个元素或一系列元素。
front 返回对向量中第一个元素的引用。
get_allocator 将对象返回到矢量使用的 allocator 类。
insert 将一个元素或多个元素插入到指定位置的向量中。
max_size 返回向量的最大长度。
pop_back 删除矢量末尾处的元素。
push_back 在矢量末尾处添加一个元素。
rbegin 返回指向反向向量中第一个元素的迭代器。
rend 返回一个指向反向矢量末尾的迭代器。
reserve 保留向量对象的最小存储长度。
resize 为矢量指定新的大小。
shrink_to_fit 放弃额外容量。
size 返回向量中的元素数量。
swap 交换两个向量的元素。

运算符

名称 说明
operator[] 返回对指定位置的矢量元素的引用。
operator= 用另一个向量的副本替换该向量中的元素。

allocator_type

一个类型,它代表向量对象的分配器类。

C++

typedef Allocator allocator_type;

注解

allocator_type 是模板参数 Allocator 的同义词。

示例

有关使用 allocator_type 的示例,请参阅 get_allocator 的示例。

assign

清除矢量并将指定的元素复制到该空矢量。

C++

void assign(size_type count, const Type& value);
void assign(initializer_list init_list);

template 
void assign(InputIterator first, InputIterator last);

参数

first
要复制的元素范围内的第一个元素的位置。

last
要复制的元素范围外的第一个元素的位置。

count
要插入到矢量的元素的副本数。

value
插入到向量中的元素的值。

init_list
包含要插入的元素的 initializer_list。

注解

首先,assign 擦除向量中的所有现有元素。 然后,assign 将指定范围内的元素从原始向量插入某个向量中,或者将新的指定值元素的副本插入某个向量。

示例

C++

/ vector_assign.cpp
// compile with: /EHsc
#include 
#include 

int main()
{
    using namespace std;
    vector v1, v2, v3;

    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);

    cout << "v1 = ";
    for (auto& v : v1){
        cout << v << " ";
    }
    cout << endl;

    v2.assign(v1.begin(), v1.end());
    cout << "v2 = ";
    for (auto& v : v2){
        cout << v << " ";
    }
    cout << endl;

    v3.assign(7, 4);
    cout << "v3 = ";
    for (auto& v : v3){
        cout << v << " ";
    }
    cout << endl;

    v3.assign({ 5, 6, 7 });
    for (auto& v : v3){
        cout << v << " ";
    }
    cout << endl;
}

C++ Vector容器使用方法详解_第1张图片 

 

at

返回对矢量中指定位置的元素的引用。

C++

reference at(size_type position);

const_reference at(size_type position) const;

参数

position
要在矢量中引用的元素的下标或位置编号。

返回值

对自变量中的下标元素的引用。 如果 position 大于向量的大小,则 at 会引发异常。

注解

如果将 at 的返回值分配给 const_reference,则可以修改向量对象。 如果将 at 的返回值分配给 reference,则可以修改矢量对象。

示例

C++

// vector_at.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;

   v1.push_back( 10 );
   v1.push_back( 20 );

   const int &i = v1.at( 0 );
   int &j = v1.at( 1 );
   cout << "The first element is " << i << endl;
   cout << "The second element is " << j << endl;
}

C++ Vector容器使用方法详解_第2张图片 

 

Output

The first element is 10
The second element is 20

back

返回对向量中最后一个元素的引用。

C++

reference back();

const_reference back() const;

返回值

向量的最后一个元素。 如果向量为空,则返回值不确定。

注解

如果将 back 的返回值分配给 const_reference,则可以修改向量对象。 如果将 back 的返回值分配给 reference,则可以修改矢量对象。

当使用定义为 1 或 2 的 _ITERATOR_DEBUG_LEVEL 进行编译时,如果试图访问空向量中的元素,则将发生运行时错误。 有关详细信息,请参阅检查的迭代器。

示例

C++

// vector_back.cpp
// compile with: /EHsc
#include 
#include 

int main() {
   using namespace std;
   vector  v1;

   v1.push_back( 10 );
   v1.push_back( 11 );

   int& i = v1.back( );
   const int& ii = v1.front( );

   cout << "The last integer of v1 is " << i << endl;
   i--;
   cout << "The next-to-last integer of v1 is "<< ii << endl;
}

C++ Vector容器使用方法详解_第3张图片 

 

begin

对该向量中第一个元素返回随机访问迭代器。

C++

const_iterator begin() const;

iterator begin();

返回值

发现 vector 中第一个元素或空 vector 之后的位置的随机访问迭代器。 始终将返回的值与 vector::end 进行比较以确保其有效。

注解

如果将 begin 的返回值分配给 vector::const_iterator,则无法修改 vector 对象。 如果将 begin 的返回值分配给 vector::iterator,则可以修改 vector 对象。

示例

C++

// vector_begin.cpp
// compile with: /EHsc
#include 
#include 

int main()
{
    using namespace std;
    vector c1;
    vector::iterator c1_Iter;
    vector::const_iterator c1_cIter;

    c1.push_back(1);
    c1.push_back(2);

    cout << "The vector c1 contains elements:";
    c1_Iter = c1.begin();
    for (; c1_Iter != c1.end(); c1_Iter++)
    {
        cout << " " << *c1_Iter;
    }
    cout << endl;

    cout << "The vector c1 now contains elements:";
    c1_Iter = c1.begin();
    *c1_Iter = 20;
    for (; c1_Iter != c1.end(); c1_Iter++)
    {
        cout << " " << *c1_Iter;
    }
    cout << endl;

    // The following line would be an error because iterator is const
    // *c1_cIter = 200;
}

C++ Vector容器使用方法详解_第4张图片 

 

Output

The vector c1 contains elements: 1 2
The vector c1 now contains elements: 20 2

capacity

返回在不分配更多的存储的情况下向量可以包含的元素数。

C++复制

size_type capacity() const;

返回值

分配给该向量的当前存储长度。

注解

如果为成员函数 resize 分配了足够的内存,它将更高效。 使用成员函数 reserve 指定分配的内存量。

示例

C++

// vector_capacity.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;

   v1.push_back( 1 );
   cout << "The length of storage allocated is "
        << v1.capacity( ) << "." << endl;

   v1.push_back( 2 );
   cout << "The length of storage allocated is now "
        << v1.capacity( ) << "." << endl;
}

 C++ Vector容器使用方法详解_第5张图片

 

Output

The length of storage allocated is 1.
The length of storage allocated is now 2.

cbegin

返回确定范围中第一个元素地址的 const 迭代器。

C++

const_iterator cbegin() const;

返回值

const 随机访问迭代器,指向范围的第一个元素,或刚超出空范围末尾的位置(对于空范围,cbegin() == cend())。

注解

由于使用 cbegin 的返回值,因此不能修改范围中的元素。

可以使用此成员函数替代 begin() 成员函数,以保证返回值为 const_iterator。 它一般与 auto 类型推导关键字一起使用,如以下示例所示。 在此示例中,将 Container 视为支持 begin() 和 cbegin() 的可修改的 (non- const) 任何类型的容器。

C++

auto i1 = Container.begin();
// i1 is Container::iterator
auto i2 = Container.cbegin();

// i2 is Container::const_iterator

cend

返回 const 超过末尾迭代器,该迭代器指向向量最后一个元素之后的元素。

C++

const_iterator cend() const;

返回值

向量的 const 超过末尾迭代器。 它指向向量最后一个元素之后的元素。 该元素是一个占位符,不应取消引用。 仅将它用于比较。 如果该向量为空,则返回 vector::cend() == vector::cbegin()

注解

cend 用于测试迭代器是否超过了其范围的末尾。

可以使用此成员函数替代 end() 成员函数,以保证返回值为 const_iterator。 它一般与 auto 类型推导关键字一起使用,如以下示例所示。 在此示例中,将 Container 视为支持 end() 和 cend() 的可修改的 (non- const) 任何类型的容器。

C++

auto i1 = Container.end();
// i1 is Container::iterator
auto i2 = Container.cend();

// i2 is Container::const_iterator

不应对 cend 返回的值取消引用。 仅将它用于比较。

clear

清除向量的元素。

C++

void clear();

示例

C++

// vector_clear.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );

   cout << "The size of v1 is " << v1.size( ) << endl;
   v1.clear( );
   cout << "The size of v1 after clearing is " << v1.size( ) << endl;
}

 C++ Vector容器使用方法详解_第6张图片

 

Output

The size of v1 is 3
The size of v1 after clearing is 0

const_iterator

一个类型,它提供可读取矢量中 const 元素的随机访问迭代器。

C++

typedef implementation-defined const_iterator;

注解

const_iterator 类型不能用于修改元素的值。

示例

有关使用 const_iterator 的示例,请参阅 back 的示例。

const_pointer

一个类型,它提供指向矢量中 const 元素的指针。

C++

typedef typename Allocator::const_pointer const_pointer;

注解

const_pointer 类型不能用于修改元素的值。

iterator 更常用于访问矢量元素。

const_reference

一个类型,它提供对向量中存储的 const 元素的引用。 它用于读取和执行 const 操作。

C++

typedef typename Allocator::const_reference const_reference;

注解

const_reference 类型不能用于修改元素的值。

示例

C++

// vector_const_ref.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;

   v1.push_back( 10 );
   v1.push_back( 20 );

   const vector  v2 = v1;
   const int &i = v2.front( );
   const int &j = v2.back( );
   cout << "The first element is " << i << endl;
   cout << "The second element is " << j << endl;

   // The following line would cause an error as v2 is const
   // v2.push_back( 30 );
}

Output

The first element is 10
The second element is 20

const_reverse_iterator

一个类型,它提供可读取矢量中任何 const 元素的随机访问迭代器。

C++

typedef std::reverse_iterator const_reverse_iterator;

注解

const_reverse_iterator 类型无法修改元素的值,它用于反向循环访问向量。

示例

有关如何声明和使用迭代器的示例,请参阅 rbegin。

crbegin

返回一个指向反向矢量中第一个元素的常量迭代器。

C++

const_reverse_iterator crbegin() const;

返回值

发现反向 vector 中的第一个元素或发现曾是非反向 vector 中的最后一个元素的常量反向随机访问迭代器。

注解

返回值为 crbegin 时,无法修改 vector 对象。

示例

C++

// vector_crbegin.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;
   vector ::iterator v1_Iter;
   vector ::const_reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   v1_Iter = v1.begin( );
   cout << "The first element of vector is "
        << *v1_Iter << "." << endl;

   v1_rIter = v1.crbegin( );
   cout << "The first element of the reversed vector is "
        << *v1_rIter << "." << endl;
}

C++ Vector容器使用方法详解_第7张图片 

 

Output

The first element of vector is 1.
The first element of the reversed vector is 2.

crend

返回 const 超过末尾反向迭代器,该迭代器指向反向向量最后一个元素之后的元素。

C++

const_reverse_iterator crend() const;

返回值

反向向量的 const 反向超过末尾迭代器。 它指向反向向量最后一个元素之后的元素,该元素与非反向向量第一个元素之前的元素相同。 该元素是一个占位符,不应取消引用。 仅将它用于比较。

注解

crend 用于反向 vector,正如 vector::cend 用于 vector 一样。

由于使用 crend 的返回值(适当递减),因此不能修改 vector 对象。

crend 可用于测试反向迭代器是否已到达其 vector 的末尾。

不应对 crend 返回的值取消引用。 仅将它用于比较。

示例

C++

// vector_crend.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;
   vector ::const_reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   for ( v1_rIter = v1.rbegin( ) ; v1_rIter != v1.rend( ) ; v1_rIter++ )
      cout << *v1_rIter << endl;
}

Output

2
1

data

返回指向向量中第一个元素的指针。

C++

const_pointer data() const;

pointer data();

返回值

一个指针,它指向 vector 中第一个元素或紧随空 vector 后的位置。

示例

C++

// vector_data.cpp
// compile with: /EHsc
#include 
#include 

int main()
{
    using namespace std;
    vector c1;
    vector::pointer c1_ptr;
    vector::const_pointer c1_cPtr;

    c1.push_back(1);
    c1.push_back(2);

    cout << "The vector c1 contains elements:";
    c1_cPtr = c1.data();
    for (size_t n = c1.size(); 0 < n; --n, c1_cPtr++)
    {
        cout << " " << *c1_cPtr;
    }
    cout << endl;

    cout << "The vector c1 now contains elements:";
    c1_ptr = c1.data();
    *c1_ptr = 20;
    for (size_t n = c1.size(); 0 < n; --n, c1_ptr++)
    {
        cout << " " << *c1_ptr;
    }
    cout << endl;
}

 

Output

The vector c1 contains elements: 1 2
The vector c1 now contains elements: 20 2

difference_type

一个类型,它提供引用同一向量中元素的两个迭代器之间的差异。

C++

typedef typename Allocator::difference_type difference_type;

注解

difference_type 也可以被描述为两个指针之间的元素数,因为指向一个元素的指针包含其地址。

iterator 更常用于访问矢量元素。

示例

C++

// vector_diff_type.cpp
// compile with: /EHsc
#include 
#include 
#include 

int main( )
{
   using namespace std;

   vector  c1;
   vector ::iterator c1_Iter, c2_Iter;

   c1.push_back( 30 );
   c1.push_back( 20 );
   c1.push_back( 30 );
   c1.push_back( 10 );
   c1.push_back( 30 );
   c1.push_back( 20 );
   c1.push_back(10);
   c1.push_back(10);
   c1.push_back(10);
   c1.push_back(30);
   c1.push_back(30);
   c1.push_back(30);
   c1.push_back(30);
   c1.push_back(30);
   c1.push_back(30);
   c1.push_back(30);

   c1_Iter = c1.begin( );
   c2_Iter = c1.end( );

   vector ::difference_type   df_typ1, df_typ2, df_typ3;

   df_typ1 = count( c1_Iter, c2_Iter, 10 );
   df_typ2 = count( c1_Iter, c2_Iter, 20 );
   df_typ3 = count( c1_Iter, c2_Iter, 30 );
   cout << "The number '10' is in c1 collection " << df_typ1 << " times.\n";
   cout << "The number '20' is in c1 collection " << df_typ2 << " times.\n";
   cout << "The number '30' is in c1 collection " << df_typ3 << " times.\n";
}

C++ Vector容器使用方法详解_第8张图片 

 

 

Output

The number '10' is in c1 collection 1 times.
The number '20' is in c1 collection 2 times.
The number '30' is in c1 collection 3 times.

emplace

将就地构造的元素插入到指定位置的向量中。

C++

template 
iterator emplace(
    const_iterator position,
    Types&&... args);

参数

position
vector 中插入第一个元素的位置。

args
构造函数参数。 函数根据所提供的自变量来推断要调用的构造函数重载。

返回值

该函数将返回一个指向 vector 中新元素的插入位置的迭代器。

注解

任何插入操作都可能产生巨额开销,请参阅 vector 类,了解有关 vector 性能的讨论。

示例

C++

// vector_emplace.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;
   vector ::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;

// initialize a vector of vectors by moving v1
   vector < vector  > vv1;

   vv1.emplace( vv1.begin(), move( v1 ) );
   if ( vv1.size( ) != 0 && vv1[0].size( ) != 0 )
      {
      cout << "vv1[0] =";
      for (Iter = vv1[0].begin( ); Iter != vv1[0].end( ); Iter++ )
         cout << " " << *Iter;
      cout << endl;
      }
}

 C++ Vector容器使用方法详解_第9张图片

 

Output

v1 = 10 20 30
vv1[0] = 10 20 30

emplace_back

将一个就地构造的元素添加到向量末尾。

C++

template 
void emplace_back(Types&&... args);

参数

args
构造函数参数。 函数根据所提供的自变量来推断要调用的构造函数重载。

示例

C++

#include 
struct obj
{
   obj(int, double) {}
};

int main()
{
   std::vector v;
   v.emplace_back(1, 3.14); // obj in created in place in the vector
}

empty

测试矢量是否为空。

C++

bool empty() const;

返回值

如果向量为空,则返回 true;如果向量不为空,则返回 false

示例

C++

// vector_empty.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;

   v1.push_back( 10 );

   if ( v1.empty( ) )
      cout << "The vector is empty." << endl;
   else
      cout << "The vector is not empty." << endl;
}

Output

The vector is not empty.

end

返回超过末尾迭代器,该迭代器指向向量最后一个元素之后的元素。

C++

iterator end();

const_iterator end() const;

返回值

向量的超过末尾迭代器。 它指向向量最后一个元素之后的元素。 该元素是一个占位符,不应取消引用。 仅将它用于比较。 如果该向量为空,则返回 vector::end() == vector::begin()

注解

如果将 end 的返回值分配给 const_iterator 类型的变量,则无法修改向量对象。 如果将 end 的返回值分配给 iterator 类型的变量,则可以修改向量对象。

示例

C++

// vector_end.cpp
// compile with: /EHsc
#include 
#include 
int main( )
{
   using namespace std;
   vector  v1;
   vector ::iterator v1_Iter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   for ( v1_Iter = v1.begin( ) ; v1_Iter != v1.end( ) ; v1_Iter++ )
      cout << *v1_Iter << endl;
}

Output

1
2

erase

从指定位置删除向量中的一个元素或一系列元素。

C++

iterator erase(
    const_iterator position);

iterator erase(
    const_iterator first,
    const_iterator last);

参数

position
要从向量中移除的元素的位置。

first
要从向量中移除的第一个元素的位置。

last
紧接要从向量中移除的最后一个元素的位置。

返回值

一个迭代器,它指定已移除的任何元素之外保留的第一个元素或指向向量末尾的指针(若此类元素不存在)。

示例

C++

// vector_erase.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;
   vector ::iterator Iter;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );
   v1.push_back( 40 );
   v1.push_back( 50 );

   cout << "v1 =" ;
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.erase( v1.begin( ) );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;
}

Output

v1 = 10 20 30 40 50
v1 = 20 30 40 50
v1 = 20 50

front

返回对向量中第一个元素的引用。

C++

reference front();

const_reference front() const;

返回值

对向量对象中第一个元素的引用。 如果向量为空,则返回值不确定。

注解

如果将 front 的返回值分配给 const_reference,则可以修改向量对象。 如果将 front 的返回值分配给 reference,则可以修改矢量对象。

当使用定义为 1 或 2 的 _ITERATOR_DEBUG_LEVEL 进行编译时,如果试图访问空向量中的元素,则将发生运行时错误。 有关详细信息,请参阅检查的迭代器。

示例

C++

// vector_front.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;

   v1.push_back( 10 );
   v1.push_back( 11 );

   int& i = v1.front( );
   const int& ii = v1.front( );

   cout << "The first integer of v1 is "<< i << endl;
   // by incrementing i, we move the front reference to the second element
   i++;
   cout << "Now, the first integer of v1 is "<< i << endl;
}

get_allocator

返回用于构造矢量的分配器对象的一个副本。

C++

Allocator get_allocator() const;

返回值

向量所使用的分配器。

注解

矢量类的分配器指定类管理存储的方式。 C++ 标准库容器类提供的默认分配器足以满足大多编程需求。 编写和使用你自己的分配器类是高级 C++ 功能。

示例

C++

// vector_get_allocator.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   // The following lines declare objects that use the default allocator.
   vector v1;
   vector > v2 = vector >(allocator( )) ;

   // v3 will use the same allocator class as v1
   vector  v3( v1.get_allocator( ) );

   vector::allocator_type xvec = v3.get_allocator( );
   // You can now call functions on the allocator class used by vec
}

insert

将一个、多个或一系列元素插入到指定位置的向量中。

C++

iterator insert(
    const_iterator position,
    const Type& value);

iterator insert(
    const_iterator position,
    Type&& value);

void insert(
    const_iterator position,
    size_type count,
    const Type& value);

template 
void insert(
    const_iterator position,
    InputIterator first,
    InputIterator last);

参数

position
向量中插入第一个元素的位置。

value
插入到向量中的元素的值。

count
插入向量中的元素数目。

first
要复制的范围元素中的第一个元素的位置。

last
要复制的元素范围以外的第一个元素的位置。

返回值

前两个 insert 函数返回一个指定新元素插入到向量的位置的迭代器。

注解

前提是,first 和 last 一定不能是矢量中的迭代器,或行为不可确定。 任何插入操作都可能产生巨额开销,请参阅 vector 类,了解有关 vector 性能的讨论。

示例

C++

// vector_insert.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;
   vector ::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;

   const auto v2 = v1;
   v1.insert( v1.begin( )+1, v2.begin( )+2, v2.begin( )+4 );
   cout << "v1 =";
   for (Iter = v1.begin( ); Iter != v1.end( ); Iter++ )
      cout << " " << *Iter;
   cout << endl;

// initialize a vector of vectors by moving v1
   vector < vector  > vv1;

   vv1.insert( vv1.begin(), move( v1 ) );
   if ( vv1.size( ) != 0 && vv1[0].size( ) != 0 )
      {
      cout << "vv1[0] =";
      for (Iter = vv1[0].begin( ); Iter != vv1[0].end( ); Iter++ )
         cout << " " << *Iter;
      cout << endl;
      }
}

Output

v1 = 10 20 30
v1 = 10 40 20 30
v1 = 10 40 50 50 50 50 20 30
v1 = 10 50 50 40 50 50 50 50 20 30
vv1[0] = 10 50 50 40 50 50 50 50 20 30

iterator

一个类型,它提供可读取或修改向量中任何元素的随机访问迭代器。

C++

typedef implementation-defined iterator;

注解

iterator 类型可用于修改元素的值。

示例

请参阅 begin 的示例。

max_size

返回向量的最大长度。

C++

size_type max_size() const;

返回值

向量的最大可取长度。

示例

C++

// vector_max_size.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;
   vector ::size_type i;

   i = v1.max_size( );
   cout << "The maximum possible length of the vector is " << i << "." << endl;
}

operator[]

返回对指定位置的矢量元素的引用。

C++

reference operator[](size_type position);

const_reference operator[](size_type position) const;

参数

position
矢量元素的位置。

返回值

如果指定的位置大于或等于容器大小,则结果为 undefined。

注解

如果将 operator[] 的返回值分配给 const_reference,则可以修改向量对象。 如果将 operator[] 的返回值分配给引用,则可以修改矢量对象。

当使用定义为 1 或 2 的 _ITERATOR_DEBUG_LEVEL 进行编译时,如果试图访问向量边界之外的元素,将发生运行时错误。 有关详细信息,请参阅检查的迭代器。

示例

C++

// vector_op_ref.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;

   v1.push_back( 10 );
   v1.push_back( 20 );

   int& i = v1[1];
   cout << "The second integer of v1 is " << i << endl;
}

operator=

用另一个向量的副本替换该向量中的元素。

C++

vector& operator=(const vector& right);

vector& operator=(vector&& right);

参数

right
要复制到 vector 中的 vector。

注解

清除 vector 中的任何现有元素后,operator= 会将 right 的内容复制或移动到 vector

示例

C++

// vector_operator_as.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector v1, v2, v3;
   vector::iterator iter;

   v1.push_back(10);
   v1.push_back(20);
   v1.push_back(30);
   v1.push_back(40);
   v1.push_back(50);

   cout << "v1 = " ;
   for (iter = v1.begin(); iter != v1.end(); iter++)
      cout << *iter << " ";
   cout << endl;

   v2 = v1;
   cout << "v2 = ";
   for (iter = v2.begin(); iter != v2.end(); iter++)
      cout << *iter << " ";
   cout << endl;

// move v1 into v2
   v2.clear();
   v2 = move(v1);
   cout << "v2 = ";
   for (iter = v2.begin(); iter != v2.end(); iter++)
      cout << *iter << " ";
   cout << endl;
}

pointer

一个类型,提供指向向量中元素的指针。

C++

typedef typename Allocator::pointer pointer;

注解

pointer 类型可用于修改元素的值。

示例

C++

// vector_pointer.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
    using namespace std;
    vector v;
    v.push_back( 11 );
    v.push_back( 22 );

    vector::pointer ptr = &v[0];
    cout << *ptr << endl;
    ptr++;
    cout << *ptr << endl;
    *ptr = 44;
    cout << *ptr << endl;
}

Output

11
22
44

pop_back

删除矢量末尾处的元素。

C++

void pop_back();

注解

有关代码示例,请参阅 vector::push_back()。

push_back

在矢量末尾处添加一个元素。

C++

void push_back(const T& value);

void push_back(T&& value);

参数

value
要赋给添加到矢量末尾处的元素的值。

示例

C++

// compile with: /EHsc /W4
#include 
#include 

using namespace std;

template  void print_elem(const T& t) {
    cout << "(" << t << ") ";
}

template  void print_collection(const T& t) {
    cout << "  " << t.size() << " elements: ";

    for (const auto& p : t) {
        print_elem(p);
    }
    cout << endl;
}

int main()
{
    vector v;
    for (int i = 0; i < 10; ++i) {
        v.push_back(10 + i);
    }

    cout << "vector data: " << endl;
    print_collection(v);

    // pop_back() until it's empty, printing the last element as we go
    while (v.begin() != v.end()) {
        cout << "v.back(): "; print_elem(v.back()); cout << endl;
        v.pop_back();
    }
}

rbegin

返回指向反向向量中第一个元素的迭代器。

C++

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

返回值

发现反向矢量中的第一个元素或发现曾是非反向矢量中的最后一个元素的反向双向迭代器。

注解

如果将 rbegin 的返回值分配给 const_reverse_iterator,则可以修改向量对象。 如果将 rbegin 的返回值分配给 reverse_iterator,则可以修改矢量对象。

示例

C++

// vector_rbegin.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;
   vector ::iterator v1_Iter;
   vector ::reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   v1_Iter = v1.begin( );
   cout << "The first element of vector is "
        << *v1_Iter << "." << endl;

   v1_rIter = v1.rbegin( );
   cout << "The first element of the reversed vector is "
        << *v1_rIter << "." << endl;
}

Output

The first element of vector is 1.
The first element of the reversed vector is 2.

reference

一个类型,它提供对向量中存储的元素的引用。

C++

typedef typename Allocator::reference reference;

示例

有关如何在向量类中使用 reference 的示例,请参阅 at。

rend

返回超过末尾反向迭代器,该迭代器指向反向向量最后一个元素之后的元素。

C++

const_reverse_iterator rend() const;
reverse_iterator rend();

返回值

反向向量的反向超过末尾迭代器。 它指向反向向量最后一个元素之后的元素,该元素与非反向向量第一个元素之前的元素相同。 该元素是一个占位符,不应取消引用。 仅将它用于比较。

注解

rend 用于反向向量,正如 end 用于向量一样。

如果将 rend 的返回值分配给 const_reverse_iterator,则无法修改向量对象。 如果将 rend 的返回值分配给 reverse_iterator,则可以修改矢量对象。

rend 可用于测试反向迭代器是否已到达其矢量末尾。

不应对 rend 返回的值取消引用。 仅将它用于比较。

示例

C++

// vector_rend.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;
   vector ::reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   for ( v1_rIter = v1.rbegin( ) ; v1_rIter != v1.rend( ) ; v1_rIter++ )
      cout << *v1_rIter << endl;
}

Output

2
1

reserve

为向量对象保留最小的存储长度,必要时为其分配空间。

C++

void reserve(size_type count);

参数

count
要分配给向量的最小存储长度。

示例

C++

// vector_reserve.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;
   //vector ::iterator Iter;

   v1.push_back( 1 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
   v1.reserve( 20 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
}

Output

Current capacity of v1 = 1
Current capacity of v1 = 20

resize

为矢量指定新的大小。

C++

void resize(size_type new_size);
void resize(size_type new_size, Type value);

参数

new_size
矢量的新大小。

value
新大小大于旧大小时添加至矢量的新元素的初始化值。 如果省略该值,则新对象将使用其默认构造函数。

注解

如果容器的大小小于请求的大小 new_size,则 resize 会在向量中添加元素,直到该容器达到请求的大小。 如果容器的大小大于请求的大小,则 resize 会删除最接近容器末尾的元素,直到该容器达到大小 new_size。 如果容器的当前大小与请求的大小相同,则不采取任何操作。

size 表示向量的当前大小。

示例

C++

// vectorsizing.cpp
// compile with: /EHsc /W4
// Illustrates vector::reserve, vector::max_size,
// vector::resize, vector::resize, and vector::capacity.
//
// Functions:
//
//    vector::max_size - Returns maximum number of elements vector could
//                       hold.
//
//    vector::capacity - Returns number of elements for which memory has
//                       been allocated.
//
//    vector::size - Returns number of elements in the vector.
//
//    vector::resize - Reallocates memory for vector, preserves its
//                     contents if new size is larger than existing size.
//
//    vector::reserve - Allocates elements for vector to ensure a minimum
//                      size, preserving its contents if the new size is
//                      larger than existing size.
//
//    vector::push_back - Appends (inserts) an element to the end of a
//                        vector, allocating memory for it if necessary.
//
//

// The debugger cannot handle symbols more than 255 characters long.
// The C++ Standard Library often creates symbols longer than that.
// The warning can be disabled:
//#pragma warning(disable:4786)

#include 
#include 
#include 

using namespace std;

template  void print(const string& s, const C& c) {
    cout << s;

    for (const auto& e : c) {
        cout << e << " ";
    }
    cout << endl;
}

void printvstats(const vector& v) {
    cout << "   the vector's size is: " << v.size() << endl;
    cout << "   the vector's capacity is: " << v.capacity() << endl;
    cout << "   the vector's maximum size is: " << v.max_size() << endl;
}

int main()
{
    // declare a vector that begins with 0 elements.
    vector v;

    // Show statistics about vector.
    cout << endl << "After declaring an empty vector:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    // Add one element to the end of the vector.
    v.push_back(-1);
    cout << endl << "After adding an element:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    for (int i = 1; i < 10; ++i) {
        v.push_back(i);
    }
    cout << endl << "After adding 10 elements:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    v.resize(6);
    cout << endl << "After resizing to 6 elements without an initialization value:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    v.resize(9, 999);
    cout << endl << "After resizing to 9 elements with an initialization value of 999:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    v.resize(12);
    cout << endl << "After resizing to 12 elements without an initialization value:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    // Ensure there's room for at least 1000 elements.
    v.reserve(1000);
    cout << endl << "After vector::reserve(1000):" << endl;
    printvstats(v);

    // Ensure there's room for at least 2000 elements.
    v.resize(2000);
    cout << endl << "After vector::resize(2000):" << endl;
    printvstats(v);
}

reverse_iterator

一个类型,它提供可读取或修改反向矢量中的任意元素的随机访问迭代器。

C++

typedef std::reverse_iterator reverse_iterator;

注解

reverse_iterator 类型用于反向循环访问向量。

示例

请参阅 rbegin 的示例。

shrink_to_fit

放弃额外容量。

C++

void shrink_to_fit();

示例

C++

// vector_shrink_to_fit.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;
   //vector ::iterator Iter;

   v1.push_back( 1 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
   v1.reserve( 20 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
   v1.shrink_to_fit();
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
}

Output

Current capacity of v1 = 1
Current capacity of v1 = 20
Current capacity of v1 = 1

size

返回向量中的元素数量。

C++复制

size_type size() const;

返回值

向量的当前长度。

示例

C++

// vector_size.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1;
   vector ::size_type i;

   v1.push_back( 1 );
   i = v1.size( );
   cout << "Vector length is " << i << "." << endl;

   v1.push_back( 2 );
   i = v1.size( );
   cout << "Vector length is now " << i << "." << endl;
}

Output

Vector length is 1.
Vector length is now 2.

size_type

一个类型,它计算矢量中的元素数目。

C++

typedef typename Allocator::size_type size_type;

示例

请参阅 capacity 的示例。

swap

交换两个向量的元素。

C++

void swap(
    vector& right);

friend void swap(
    vector& left,
    vector& right);

参数

right
一个提供要交换的元素的向量。 或者一个其元素将与向量 left 中的元素进行交换的向量。

left
一个其元素将与向量 right 中的元素进行交换的向量。

示例

C++

// vector_swap.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector  v1, v2;

   v1.push_back( 1 );
   v1.push_back( 2 );
   v1.push_back( 3 );

   v2.push_back( 10 );
   v2.push_back( 20 );

   cout << "The number of elements in v1 = " << v1.size( ) << endl;
   cout << "The number of elements in v2 = " << v2.size( ) << endl;
   cout << endl;

   v1.swap( v2 );

   cout << "The number of elements in v1 = " << v1.size( ) << endl;
   cout << "The number of elements in v2 = " << v2.size( ) << endl;
}

Output

The number of elements in v1 = 3
The number of elements in v2 = 2

The number of elements in v1 = 2
The number of elements in v2 = 3

value_type

一个类型,它代表向量中存储的数据类型。

C++

typedef typename Allocator::value_type value_type;

注解

value_type 是模板参数 Type 的同义词。

示例

C++

// vector_value_type.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   vector::value_type AnInt;
   AnInt = 44;
   cout << AnInt << endl;
}

Output

44

vector

构造向量。 重载构造一个特定大小的向量,或具有特定值的元素的向量。 或者,作为其他某个向量的整体或一部分的副本。 某些重载还允许指定要使用的分配器。

C++

vector();
explicit vector(const Allocator& allocator);
explicit vector(size_type count);
vector(size_type count, const Type& value);
vector(size_type count, const Type& value, const Allocator& allocator);

vector(const vector& source);
vector(vector&& source);
vector(initializer_list init_list, const Allocator& allocator);

template 
vector(InputIterator first, InputIterator last);
template 
vector(InputIterator first, InputIterator last, const Allocator& allocator);

参数

allocator
要用于此对象的分配器类。 get_allocator 返回对象的分配器类。

count
构造的矢量中的元素数。

value
构造的矢量中的元素值。

source
要成为副本的构造的矢量中的矢量。

first
要复制的元素范围内的第一个元素的位置。

last
要复制的元素范围外的第一个元素的位置。

init_list
包含要复制的元素的 initializer_list

注解

所有构造函数都存储分配器对象 (allocator) 并初始化此向量。

前两个构造函数指定一个空初始矢量。 第二个构造函数显式指定要使用的分配器类型 (allocator)。

第三个构造函数指定类 count 的默认值的指定数量 (Type) 的元素的重复。

第四个和第五个构造函数指定值为 value 的 (count) 个元素的重复元素。

第六个构造函数指定矢量 source 的副本。

第七个构造函数移动矢量 source

第八个构造函数使用 initializer_list 指定元素。

第九个和第十个构造函数复制矢量的范围(firstlast)。

示例

C++

// vector_ctor.cpp
// compile with: /EHsc
#include 
#include 

int main()
{
    using namespace std;
    vector ::iterator v1_Iter, v2_Iter, v3_Iter, v4_Iter, v5_Iter, v6_Iter;

    // Create an empty vector v0
    vector  v0;

    // Create a vector v1 with 3 elements of default value 0
    vector  v1(3);

    // Create a vector v2 with 5 elements of value 2
    vector  v2(5, 2);

    // Create a vector v3 with 3 elements of value 1 and with the allocator
    // of vector v2
    vector  v3(3, 1, v2.get_allocator());

    // Create a copy, vector v4, of vector v2
    vector  v4(v2);

    // Create a new temporary vector for demonstrating copying ranges
    vector  v5(5);
    for (auto i : v5) {
        v5[i] = i;
    }

    // Create a vector v6 by copying the range v5[ first,  last)
    vector  v6(v5.begin() + 1, v5.begin() + 3);

    cout << "v1 =";
    for (auto& v : v1){
        cout << " " << v;
    }
    cout << endl;

    cout << "v2 =";
    for (auto& v : v2){
        cout << " " << v;
    }
    cout << endl;

    cout << "v3 =";
    for (auto& v : v3){
        cout << " " << v;
    }
    cout << endl;
    cout << "v4 =";
    for (auto& v : v4){
        cout << " " << v;
    }
    cout << endl;

    cout << "v5 =";
    for (auto& v : v5){
        cout << " " << v;
    }
    cout << endl;

    cout << "v6 =";
    for (auto& v : v6){
        cout << " " << v;
    }
    cout << endl;

    // Move vector v2 to vector v7
    vector  v7(move(v2));
    vector ::iterator v7_Iter;

    cout << "v7 =";
    for (auto& v : v7){
        cout << " " << v;
    }
    cout << endl;

    vector v8{ { 1, 2, 3, 4 } };
    for (auto& v : v8){
        cout << " " << v ;
    }
    cout << endl;
}

Output

v1 = 0 0 0v2 = 2 2 2 2 2v3 = 1 1 1v4 = 2 2 2 2 2v5 = 0 1 2 3 4v6 = 1 2v7 = 2 2 2 2 21 2 3 4

你可能感兴趣的:(c++,开发语言,windows,mfc)