簡體   English   中英

聲明集合中向量的大小。 C ++

[英]declaring sizes of vectors in a collection. c++

using namespace std;

vector<vector<T> > vec_collection(3);

vec_collection[0]=vector<T>(12);
vec_collection[1]=vector<T>(3);
vec_collection[2]=vector<T>(14);

假設我有3個向量的空集合,並且在初始化之后,我希望第一個,第二個和第三個向量的大小分別為12、3和14。 上面的代碼片段是聲明其大小的正確方法嗎?

原則上,您的代碼創建了單獨的臨時vector實例,這些實例替代了現有的零尺寸實例,這在理論上意味着對於每一行,您都有一個構造函數調用(創建臨時實例),一個復制構造函數調用(將其復制到現有vector )和析構函數調用(銷毀臨時對象)。

盡管我認為有些優化實際上可以使它比聽起來更好,但是簡單地這樣做會更容易並且幾乎肯定會更有效率:

using namespace std;

vector< vector<T> > vec_collection(3);

vec_collection[0].resize(12);
vec_collection[1].resize(3);
vec_collection[2].resize(14);

在另一方面,如果需要這樣的vector s至是總是固定的大小的,則應該用固定大小的數據結構替換它們(例如一個struct包含三個C樣式陣列或std::array ),如在@ sehe的回答

是。 盡管如此,它不能使向量固定大小(可以顯式或隱式地調整向量的大小,例如,使用push_backinsert )。

最后,可以簡單地分配矢量。

如果您需要強類型,固定大小,鋸齒狀的嵌套向量(urrfff令人難以置信):

#include <tuple>
#include <array>

using std::array;
using std::tuple;

typedef tuple<
       array<T, 12>,
       array<T, 3>,
       array<T, 14>
    > vec_collection;

這樣做會比較尷尬,但是如果速度和容器大小保證至關重要,那就去做吧。

請注意,在TR1之前的世界中(例如,帶有c ++ 03庫的c ++ 98),這將相當接近(但使用起來更不舒服):

struct vec_collection
{
     T a[12];
     T b[3];
     T c[14];
};

如果您擁有C ++ 11,則可以使用一個更有效的初始化列表來實現:

vector<vector<T>> vec_collection(3) { vector<T>(12), vector<T>(3), vector<T>(14) };

否則,您可以按照自己的方式進行操作,這很好,或者僅對Matteo的answer中的元素調用resize

vector< vector<T>* > vec_collection(3); // i changed it to a vector of vector<T>*


 vec_collection[0]=new vector<MyType>(12);
 //etc

您可能想要在代碼中替換為。 例如

vector<int>(12);

而且,如果向量是固定大小的,則只能使用數組。

暫無
暫無

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

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