在运行时设置向量向量的大小

Posted

技术标签:

【中文标题】在运行时设置向量向量的大小【英文标题】:Set size of vector of vectors at run time 【发布时间】:2016-05-07 10:17:34 【问题描述】:

我想知道,如何。

如果我有固定尺寸,我通常会这样做

std::vector<std::vector<int>> ref(5);

然后我通过

推送特定向量中的元素
ref[i].push_back(23); // i = 0,1,...4

现在如果有兴趣在运行时设置大小,意味着我想通过命令行参数获取大小,并以与上述相同的方式推送元素。

我想通过保持打开来声明向量的向量来做到这一点

std::vector<std::vector<int>> ref;

然后推送元素

ref[i].push_back(23);

但我肯定是错的,因为我得到了错误

分段错误(核心转储)

【问题讨论】:

初始化向量std::vector<:vector>> ref 是为特殊的东西设置尺寸吗? 只是一个小注释 i = 1..5,ref[i] 会出现段错误,索引在 C++ 中从零开始,所以 i 的范围必须是 0..4。 【参考方案1】:

我想通过命令行参数获取大小,并以与上面相同的方式推送元素。

在询问i之前询问用户最大尺寸:

cout << "What is the size of your vector? ";
int size;
cin >> size;
std::vector<std::vector<int>> ref(size);

现在您可以请求i,将它们与size 核对,然后调用ref[i] 而不会崩溃。

【讨论】:

为什么允许std::vector&lt;std::vector&lt;int&gt;&gt; ref(size);?为什么不需要动态分配?您能否解释一下或将我链接到合适的问题。【参考方案2】:

您可以使用std::vector::resize。如果输入大小大于向量的当前大小而不改变向量的内容,它会增加向量的容量。 (它可能会重新分配向量,但这不会影响您的程序)

像你一样初始化向量:vector&lt;vector&lt;int&gt; &gt; ref;

现在,当您向后推时,请检查 i 是否在矢量的当前大小范围内。如果没有,请调整std::vector 的大小,然后调用std::vector::push_back

if(i>=ref.size())
    ref.resize(i);
ref[i].push_back(23);

【讨论】:

【参考方案3】:

你一直保持打开状态很好,你只是忘记了初始化。

std::vector<std::vector<int>> ref

编辑:当然,如果你想让 ref 增长,你还需要在其中推回向量:

std::vector<int> v1;
ref.push_back(v1);

那么,

ref[1][0]=23.

【讨论】:

它只适用于一个向量 ref[0] ,之后是terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc 我提出的解决方案并不神奇。您可以使 ref 增长而无需设置其大小 - 正如所提出问题的最后一部分 - 但当然您需要添加必要的 push_back。

以上是关于在运行时设置向量向量的大小的主要内容,如果未能解决你的问题,请参考以下文章

在运行时给出其大小的向量的堆栈空间? (C代码)

在没有向量、指针的情况下在 C++ 中在运行时增加数组大小 [关闭]

只有在运行时才知道,有没有一种有效的方法来初始化多维向量的大小?

在运行时设置向量类型

meta.Vectors 背后的黑魔法是啥?

X86 架构 - 使用 unsigned long long 设置向量大小