【问题标题】:Can you populate a vector of vectors anonymously in C++?您可以在 C++ 中匿名填充向量向量吗?
【发布时间】:2019-06-19 01:20:32
【问题描述】:

在 C++ 中,我想创建一个向量向量,每个向量都包含整数。目前我必须做类似的事情

std::vector<std::vector<int>> vectors;
std::vector<int> v1;
std::vector<int> v2;

然后

vectors.push_back(v1);
vectors.push_back(v2);

在java中你可以跳过声明v1和v2,只需初始化包含其他向量的向量,然后进行循环或其他操作

myArrayList.add(new ArrayList<int>());

你能在 C++ 中做到这一点吗?如果是这样,怎么做?谢谢

编辑:另外,当您添加匿名/未命名对象时,这叫什么?我使用术语“匿名”来指代一个未命名的向量,或者在 java 示例中,一个未命名的新数组列表对象。我确定它有一个术语,但我不知道它是什么,所以我无法在谷歌上搜索它。

【问题讨论】:

  • 你可以直接vectors.resize(2)
  • @NicoSchertler 为什么?有接受计数的构造函数重载 - std::vector&lt;std::vector&lt;int&gt;&gt; vectors(2);

标签: c++


【解决方案1】:

你说的是一个没有变量的对象 在java中,我们使用new ArrayList&lt;Integer&gt;()。 在 C++ 中,我们使用std::vector&lt;int&gt;()。 这行得通,因为在 C++ 中,理论上我们可以说

std::vector<int> my_vector = std::vector<int>();

上面的代码在功能上等同于std::vector&lt;int&gt;my_vector;,因为C++会自动调用构造函数。 C++ 这样做的原因是因为 C++ 没有 null 类型,不像 Java。

这样就变成了:

vectors.push_back(std::vector<int>());

PS。

Java 对象 = C++ 指针。 C++ 指针的值为nullptr0,Java 对象的默认值为null

编辑: Nico Schertler 有一个有趣的解决方案,你也应该看看。我不会将它们包含在我的答案中,因此如果他愿意,他可以从中做出答案,但请查看他的评论。

【讨论】:

  • 请注意,在 C++11 之前,vectors.push_back(std::vector&lt;int&gt;()); 将构造一个临时的 vector&lt;int&gt;,然后复制它以进行推送。在 C++11 及更高版本中,它将按原样移动临时文件,而不是复制它。为了完全避免 temp,您可以改用 vectors.resize(vectors.size()+1);,或者在 C++11 及更高版本中,vectors.emplace_back();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2021-11-26
  • 2017-12-12
  • 1970-01-01
相关资源
最近更新 更多