簡體   English   中英

關於c ++中的向量的問題

[英]a question about vector in c++

我讀了一些用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)嗎?

是的,這是允許的,是的,你做得對。

您正在調用此模板化構造函數:

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

模板參數InputIteratorint* (這是表達式iarriarr + 10 )。

由於文檔聲明_Last必須指向超出范圍中最后一個元素一個元素, + 10也正確復制數組中的所有10個元素( iarr + 9個點到最后一個元素, iarr + 10個點到一個超出最后一個元素)。

數組的簡單幫助:

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

而且不用擔心數組的大小,它會自動計算。

是的,這是std::vector的構造函數。 就是這個:

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

它需要兩個迭代器(在您的情況下為指針),一個用於初始化,另一個用於初始化向量的元素序列的末尾。 最后一個參數是可選的,除非您使用自定義分配器,否則不需要它。

到最后的迭代器應該是您想要包含的最后一個元素的一個。 所以,如果你想要從iarr[0]iarr[9]所有元素,你需要傳入iarr + 10

它使用迭代器分配一個向量,並顯示原始的iarr []。 有十個元素,+ 10是一個適當的迭代,因為它是一個結束的一步。 這就是矢量的工作原理 - 它必須指向一個過去的位置。 它將數組的內容復制到向量中。 更清楚的是,它使用此模板來創建向量:

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

迭代構造函數:在第一個和最后一個之間進行迭代,將每個元素序列的副本設置為容器的內容。

如果您在此處查看文檔,則確實允許使用此代碼

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

參數指定的范圍遵循通常的約定[first,last [,因此如果要復制整個數組,則傳遞iarr + 10是正確的

是的,這是允許的, ivector將包含10個元素。 不,它不應該是9因為結束迭代器應該是結束一步 如果您知道范圍是什么,則該范圍將由此范圍表示: [beginning, end) 也就是說,包括第一個,然后直到但不包括最后一個。

因為STL(C ++標准庫咳嗽 )是所有模板,所以支持運算符++* (取消引用運算符)的任何東西都可以作為迭代器傳遞給向量構造函數。 這個屬性令人驚訝地使相同的代碼適用於指針和vector迭代器。 最好的標准庫設計。

是的,函數main()中的最后一行調用std :: vector的構造函數。 看看這里看到所有向量構造函數重載。 第三個在這里使用。 它的參數是模板類型的迭代器(此處使用的模板參數是int ,因此迭代器的類型為int* )。 第二個參數是迭代器,它指向不會被復制到向量中的第一個序列元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM