初始化具有保留容量的嵌套向量的子向量

时间:2012-08-18 18:56:54

标签: c++ stl vector

我想创建矢量矢量,使每个子矢量具有预定义的容量但未初始化。

以下是我不想做的事情的代码:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> tVec;
    tVec.reserve( 5 );
    cout<<"tVec Size: "<<tVec.size()<<", capacity: "<<tVec.capacity()<<endl;

    vector< vector<int> > tmpVecVec( 2, tVec );
    cout<<"tmpVecVec[0] Size: "<<tmpVecVec[0].size()<<", capacity: "<<tmpVecVec[0].capacity()<<endl;
    cout<<"tmpVecVec[1] Size: "<<tmpVecVec[1].size()<<", capacity: "<<tmpVecVec[0].capacity()<<endl;
}

以上输出为:

tVec Size: 0, capacity: 5
tmpVecVec[0] Size: 0, capacity: 0
tmpVecVec[1] Size: 0, capacity: 0

我想知道如何获得以下结果

tVec Size: 0, capacity: 5
tmpVecVec[0] Size: 0, capacity: 5
tmpVecVec[1] Size: 0, capacity: 5

当然如果我用resize替换reserve或者在tVec的构造函数中提供大小5,我可以这样做。但是,我可以不使用这些方法吗?

链接到工作代码:http://ideone.com/PBXeP

3 个答案:

答案 0 :(得分:2)

如果您希望使用vector s描述的行为,则应使用此功能。 (它可能无法满足您提出的所有后续要求。)

int size = 5, capacity = 5;
vector<vector<int>> tmpVecVec(size);
for (auto& vec: tmpVecVec)
   vec.reserve(capacity);

答案 1 :(得分:0)

#include "stdafx.h"
#include<vector>
using namespace std;
int main ()
{
    vector<vector<int>>baz(5);
    baz.reserve(5);
    baz[0].reserve(10);
    baz[0].reserve(20);

    printf(" %i ",baz.capacity());
    printf(" %i ",baz[0].capacity());
    printf(" %i ",baz[1].capacity());
    getchar();
    return 0;
}

输出为5,10和20

答案 2 :(得分:0)

嗯,这是由你的库的实现定义的,所以它不是很好,但它可能适用于小元素计数:

vector<int>tVec(5, 0);
cout << "tVec Size: " << tVec.size() << ", capacity: " << tVec.capacity() << endl;
vector<vector<int> >tmpVecVec(2, tVec);
tmpVecVec[0].clear();
tmpVecVec[1].clear();
cout << "tmpVecVec[0] Size: " << tmpVecVec[0].size() << ", capacity: " << tmpVecVec[0].capacity() << endl;
cout << "tmpVecVec[1] Size: " << tmpVecVec[1].size() << ", capacity: " << tmpVecVec[0].capacity() << endl;

哪个输出:

tmpVecVec[0] Size: 0, capacity: 5
tmpVecVec[1] Size: 0, capacity: 5

在我的系统上使用GNU的libstdc ++和LLVM的libc ++。

但我认为reserve()是更好的方法。