为啥不能在 2D 向量中 push_back? C++

Posted

技术标签:

【中文标题】为啥不能在 2D 向量中 push_back? C++【英文标题】:Why cant you push_back in 2D vector? c++为什么不能在 2D 向量中 push_back? C++ 【发布时间】:2017-10-10 17:58:43 【问题描述】:

我正在学习 C++ 中的递归,但一直被困在为什么不能简单地使用 .push_back() 而不是创建一个函数来复制 specific_previous_result 元素,然后是 .push_back()

vector<vector<int>> get_every_n_elements(vector<int> arr, int n) 
if (n == 0) 
    vector<vector<int>> result;

    vector<int> empty_list;
    result.push_back(empty_list);

    return result;


vector<vector<int>> previous_result = get_every_n_elements(arr, n - 1);

vector<vector<int>> current_result; //empty

for (auto specific_previous_result : previous_result)  // [[]] -> []

    for (auto elem : arr)  // [1,2,3,4] -> 1
      //current_result.push_back(specific_previous_result.push_back(elem));
      //This does not work^^

      current_result.push_back(group(specific_previous_result, elem));
      //The group function copies all elements to newVec and push_back(elem) after
      //Then returns newVec with elem at the end
    



return current_result;

我在运行 push_back 行时得到的错误是 error: invalid use of void expression current_result.push_back(specific_previous_result.push_back(elem));。感谢您的帮助。

【问题讨论】:

即使它确实有效,它也会达到你的预期,因为specific_previous_result 是向量的副本,你需要for (auto&amp; specific_previous_result : previous_result) 来代替 那一行到底是什么意思?您正在尝试推送另一个 push_back 的返回值,但 push_back 返回 void 【参考方案1】:

似乎没有正当理由在push_back 之后返回向量本身。有时它很有用,但大多数时候,它不是。我建议将它写成两行,这也比单独的(而且效率低下!)函数更清晰 IMO:

current_result.push_back(specific_previous_result);
current_result.back().push_back(elem);

【讨论】:

【参考方案2】:

该行导致编译器给你invalid use of void expression current_result.push_back(specific_previous_result.push_back(elem)); 错误的原因是微不足道的。看看有问题的行:

current_result.push_back(specific_previous_result.push_back(elem));

粗体部分是调用向量的push_back 函数,该函数具有void 返回类型。您正试图将此void 返回值作为参数传递给current_result.push_back

See the documentation for std::vector::push_back. 可以看到,两个重载的返回值都是void

您自己说过,您的 group 函数是返回一个向量,然后您将其推到 current_result 向量的背面。这就是编译使用group 函数的行的原因。

【讨论】:

哦,我明白了,我不知道 std::vector::push_back 返回 void。我来自 Python,我的印象是它返回了向量的副本,并在末尾附加了新元素。

以上是关于为啥不能在 2D 向量中 push_back? C++的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能直接从向量中的函数 push_back 更新值? [关闭]

2D 向量 push_back

为啥我无法将对象 push_back 放入 C++ 多维向量中

使用 push_back 向向量添加非空字符串,向量内容为空。为啥字符串没有添加到向量中?

为啥我会使用 push_back 而不是 emplace_back?

.push_back 如何在 C++ 中工作?