【问题标题】:Why can we push_back a subvector defined only with range? [closed]为什么我们可以 push_back 只用范围定义的子向量? [关闭]
【发布时间】:2020-10-24 07:44:24
【问题描述】:

假设我有一个 vector<int> a = {1,2,3,4,5,6} 和 vector<vector<int>>b 。为什么我们可以写

b.push_back({a.begin() + 1, a.begin() + 4});

最后是b = {{2345}}?我从一部分代码中对此进行了简化,因此如果这组特定的代码不起作用,我将粘贴实际代码。我认为简化将有助于理解其背后的想法。

【问题讨论】:

  • 因为 STL 的作者是这样设计的。问题是什么?问题?
  • ...以及如何在不给出范围的情况下描述子向量?
  • 您尝试过吗?当你这样做时会发生什么?
  • 为什么这个问题被关闭了?这是一个非常具体的语法,有一个非常具体的答案为什么它起作用(我的意思是,给定的答案没有很好地解释它,但可以在这里解释自动转换)。
  • 我的意思是,我想在这里看到语言律师的回答,但问题已关闭。

标签: c++ vector push-back


【解决方案1】:
b.push_back({a.begin() + 1, a.begin() + 4});

相当于:

std::vector<int> c{a.begin() + 1, a.begin() + 4};
b.push_back(c);

这只是调用std::vector constructor,它接受一对迭代器并将这些迭代器之间的值复制到新向量中。

【讨论】:

  • 当然,b.emplace_back(a.begin() + 1, a.begin() + 4); 可能更有效。
  • @Deduplicator 应该不会有太大区别,原始代码中的向量是临时的,所以无论如何都应该移动,所以它只是一个移动构造函数,你应该避免使用emplace_back
猜你喜欢
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多