7

我有一个本地的std::vector<std::reference_wrapper<T> >,现在我想返回其元素的真实副本(即std::vector<T>)。有比循环更好的方法吗?

例子:

std::vector<T> foobar() {
    std::vector<std::reference_wrapper<T> > refsToLocals;
    /*
      do smth with refsToLocals
    */
    std::vector<T> copyOfLocals;
    for (auto local : refsToLocals)
        copyOfLocals.insert_back(local.get());
    return copyOfLocals;
}
4

2 回答 2

8

看来,显而易见的方法是std::vector<T>从 的序列中构造 a std::vector<std::reference_wrapper<T>>

std::vector<T> foobar() {
    std::vector<std::reference_wrapper<T> > refsToLocals;
    /* do smth with refsToLocals */
    return std::vector<T>(refsToLocals.begin(), refsToLocals.end());
}
于 2015-12-26T01:01:25.710 回答
1

你可以这样使用std::copy

std::copy(
    refsToLocals.begin(), 
    refsToLocals.end(), 
    std::back_inserter(copyOfLocals));

一定要使用 call copyOfLocals.reserve(refsToLocals.size())。它将最小化副本和堆分配。

于 2015-12-26T00:14:39.840 回答