在不使用前一个向量的开始和结束的情况下将一个向量插入另一个向量中 (C++20)?

Insert a vector inside another vector without using the former vector's begin and end (C++20)?

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

#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());
}

所以我不能在不先存储临时结果的情况下调用开始和结束。有没有办法完成这项工作?在 ranges 上的一次 cppcon 演讲中,我听到有人说它可能是开始和结束的结尾。所以我想可能有一些方法可以用范围库来实现这样的事情。

你可以这样做:

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不能。