[英]std::vector of an array
以下聲明通過編譯檢查:
int arr[3];
vector<int[3]> vec; // ok !!
嘗試將vec
實際用作時,
vec.push_back(arr);
它導致許多錯誤,例如:
/usr/include/c++/4.6/ext/new_allocator.h:108:9: error: ISO C++ forbids initialization in array new [-fpermissive]
/usr/include/c++/4.6/bits/vector.tcc:314:4: error: invalid array assignment
/usr/include/c++/4.6/ext/new_allocator.h:118:30: error: request for member ‘~int [3]’ in ‘* __p’, which is of non-class type ‘int [3]’
另外, vec
也不將int*
push_back()
。
這里到底出了什么問題? C ++ 11中是否解決了此類問題?
標准庫容器的基本要求是,元素應為Copy可構造和可分配的 。
數組不可分配,因此會出現錯誤,您不能將它們用作標准庫容器元素。
參考:
C ++ 03 Standard:23.1容器要求[lib.container.requirements]
第3段:
存儲在這些組件中的對象的類型必須滿足CopyConstructible類型(20.1.3)的要求以及Assignable類型的其他要求。
您不能將數組存儲在容器中,因為它們既不可分配也不可復制,這是與標准庫容器一起使用的所有對象的要求。
僅當您執行push_back()
時才嘗試使用賦值運算符,這就是為什么代碼不使用它即可編譯的原因 。
與其他容器一樣, vector
s也無法存儲數組,原因與您無法將數組分配給另一個數組的原因相同。 您有兩種選擇:
std::vector< std::vector<int> >
。 std::array
的std::vector
更好。 然后,您將得到vec
類型為std::vector< std::array<int, 3> >
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.