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

时间:2011-09-13 22:01:28

标签: c++ vector

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。以上代码段是否是声明其大小的正确方法?

4 个答案:

答案 0 :(得分:7)

您的代码符合原则创建了分离的临时vector实例,这些实例替换了现有的零大小实例,理论上这意味着对于每一行您都有构造函数调用(创建临时),副本-constructor调用(将其复制到现有的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始终具有固定大小,则应使用固定大小的数据结构替换它们(例如,包含三个C样式数组的structstd::array),如@sehe's answer

答案 1 :(得分:3)

是。尽管它不会使矢量固定大小(矢量可以明确地或隐含地重新调整大小 - 例如使用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];
};

答案 2 :(得分:2)

如果您使用的是C ++ 11,则可以使用更高效的初始化列表来执行此操作:

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

否则,您可以按照自己的方式进行,也可以在Matteo's answer之类的元素上调用resize

答案 3 :(得分:-1)

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

此外,如果你的矢量是固定大小的,你可以只使用数组。