【问题标题】:Insert a vector inside another vector without using the former vector's begin and end (C++20)?在另一个向量中插入一个向量而不使用前一个向量的开始和结束 (C++20)?
【发布时间】:2020-11-14 21:51:06
【问题描述】:

目前我正在像这样在另一个向量中插入一个向量:

#include <vector>

int main(const int argc, const char** argv)
{
    std::vector<int> old_elements{1, 2, 3};

    std::vector<int> elements{4, 5, 6};
    elements.insert(elements.end(), old_elements.begin(), old_elements.end());
}

我想做的是这样的

std::vector<int> get_old_elements()
{
    return std::vector<int>{1, 2, 3};
}

int main(const int argc, const char** argv)
{
    std::vector<int> elements{4, 5, 6};
    elements.insert(elements.end(), get_old_elements());
}

所以我不能在不先存储临时结果的情况下调用 begin 和 end。有没有办法做到这一点?在ranges 的一次 cppcon 会谈中,我听说它可能是开始和结束的结束。所以我想可能有一些方法可以通过范围库来实现这样的目标。

【问题讨论】:

  • elements = get_old_elements() 怎么样?
  • 更新了问题,让我更清楚我打算做什么
  • @yasht:为什么要避免存储本地对象?

标签: c++ c++11 stl stdvector c++20


【解决方案1】:

你可以这样做:

std::experimental::ranges::copy(get_old_elements(), std::back_inserter(elements));

但这样做会更有效率:

template <typename From, typename To>
void append(const From& from, To& to) {
    to.insert(std::begin(from), std::end(from), to.end());
}

append(get_old_elements(), elements);

这可以为新元素保留容量,而 back_inserter 不能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 2010-09-23
    • 2014-02-24
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多