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。以上代码段是否是声明其大小的正确方法?
答案 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样式数组的struct
或std::array
),如@sehe's answer。
答案 1 :(得分:3)
是。尽管它不会使矢量固定大小(矢量可以明确地或隐含地重新调整大小 - 例如使用push_back
或insert
)。
最后,可以简单地分配向量。
如果你需要强类型,固定大小,锯齿状的嵌套向量(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);
此外,如果你的矢量是固定大小的,你可以只使用数组。