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

Initializing sub-vectors of nested vectors with reserved capacity

本文关键字:向量 嵌套 容量 初始化      更新时间:2023-10-16

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

这是不执行我想执行的操作的代码:

#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

当然,如果我用调整大小替换保留或在 tVec 的构造函数中提供大小 5,我可以做到这一点。但是,我可以在不使用这些方法的情况下执行此操作吗?

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

如果您希望使用

vector s 来描述的行为,您应该使用这种行为(它可能无法满足您以后提出的所有要求。

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

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

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() 是更好的方法。

#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