关于c ++中的向量的问题

时间:2011-06-22 13:58:14

标签: c++ arrays vector

我读了一些用c ++编写的代码如下:

#include <algorithm>
#include <iostream> 
#include <vector>

using namespace std;

int main() {
    int iarr[] = {30, 12, 55, 31, 98, 11, 41, 80, 66, 21};
    vector<int> ivector(iarr, iarr + 10);
}

在上面的代码中,我将iarriarr+10传递给ivector(iarr, iarr + 10)以创建新的向量,这是构建vector的正确方法吗?我检查了STL文件,那里没有提到,这是允许的吗?

而且,数组iarr包含10个元素,我应该使用ivector(iarr, iarr+9)吗?

7 个答案:

答案 0 :(得分:12)

是的,这是允许的,是的,你做得对。

您正在调用此模板化构造函数:

template<class InputIterator>
   vector(
      InputIterator _First,
      InputIterator _Last
   );

模板参数InputIteratorint*(这是表达式iarriarr + 10)的类型。

由于文档指出_Last必须指向范围内最后之外的一个元素,因此+ 10也可以复制数组中的所有10个元素( iarr + 9指向最后一个元素,iarr + 10指向超出最后一个元素的一个元素。)

答案 1 :(得分:5)

数组的简单助手:

template <typename T, size_t N>
size_t size(T(&)[N]) { return N; }

template <typename T, size_t N>
T* begin(T(&array)[N]) { return array; }

template <typename T, size_t N>
T* end(T(&array)[N]) { return array + N; }

现在你可以写:

int main() {
  int const arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
  std::vector<int> vec(begin(arr), end(arr));
}

不再担心数组的大小,它会自动计算。

答案 2 :(得分:3)

是的,这是std::vector的构造函数。就是这个:

template <class InputIterator>
     vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );

它需要两个迭代器(在您的情况下为指针),一个用于初始化,另一个用于初始化向量的元素序列的末尾。最后一个参数是可选的,除非您使用自定义分配器,否则不需要它。

结尾的迭代器应该是您想要包含的最后一个元素的一个。因此,如果您想要从iarr[0]iarr[9]的所有元素,则需要传递iarr + 10

答案 3 :(得分:1)

它使用迭代器分配一个向量,并显示原始的iarr []。有十个元素,+ 10是一个适当的迭代,因为它是一个结束的一步。这就是矢量的工作原理 - 它必须指向一个过去的位置。它将数组的内容复制到向量中。更清楚的是,它使用此模板来创建向量:

template <class InputIterator> vector ( InputIterator first, 
InputIterator last, const Allocator& = Allocator() );
  

迭代构造函数:迭代   在第一个和最后一个之间,设置副本   每个元素序列的   容器的内容。

答案 4 :(得分:1)

如果您查看文档here

,则确实允许使用此代码
template <class InputIterator>
vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );

参数指定的范围遵循通常的约定[first,last [,因此如果要复制整个数组,则传递iarr + 10是正确的

答案 5 :(得分:0)

是的,这是允许的,ivector将包含10个元素。不,它不应该是9因为结束迭代器应该超过结束的一步。如果您知道范围是什么,则该范围将由此范围表示:[beginning, end)。也就是说,包括第一个,然后直到但不包括最后一个。

因为STL(C ++标准库 cough )是所有模板,所以支持运算符++*(取消引用运算符)的任何东西都可以作为迭代器传递给矢量构造函数。这个属性令人惊讶地使相同的代码适用于指针和vector迭代器。标准库设计处于最佳状态。

答案 6 :(得分:0)

是的,函数main()中的最后一行调用std :: vector的构造函数。看看here 查看所有向量构造函数重载。第三个在这里使用。它的参数是模板类型的迭代器(这里使用的模板参数是int,因此迭代器的类型为int*)。第二个参数是迭代器,它指向不会被复制到向量中的第一个序列元素。