如何将std::vector<std::reference_wrapper<T>>转换为std::vector<T>?

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;
}
2个回答

8

看起来,很明显的方法就是从 std::vector<std::reference_wrapper<T>> 序列构建一个 std::vector<T>

std::vector<T> foobar() {
    std::vector<std::reference_wrapper<T> > refsToLocals;
    /* do smth with refsToLocals */
    return std::vector<T>(refsToLocals.begin(), refsToLocals.end());
}

1
您可以这样使用std::copy
std::copy(
    refsToLocals.begin(), 
    refsToLocals.end(), 
    std::back_inserter(copyOfLocals));

请确保使用调用copyOfLocals.reserve(refsToLocals.size())。它将最小化复制和堆分配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接