[英]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);
}
在上面的代碼中,我將iarr
和iarr+10
傳遞給ivector(iarr, iarr + 10)
以創建一個新的向量,這是構建vector
的正確方法嗎? 我檢查了STL文件,那里沒有提到,這是允許的嗎?
而且,數組iarr
包含10個元素,我應該使用ivector(iarr, iarr+9)
嗎?
是的,這是允許的,是的,你做得對。
您正在調用此模板化構造函數:
template<class InputIterator>
vector(
InputIterator _First,
InputIterator _Last
);
模板參數InputIterator
是int*
(這是表達式iarr
和iarr + 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.