如何将 std::vector<std::reference_wrapper<T> > 转换为 std::vector<T>
How to convert std::vector<std::reference_wrapper<T> > to std::vector<T>
我有一个本地 std::vector<std::reference_wrapper<T> >
,现在我想 return 其元素的 真实副本 (即 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;
}
您可以这样使用 std::copy
:
std::copy(
refsToLocals.begin(),
refsToLocals.end(),
std::back_inserter(copyOfLocals));
一定要使用调用copyOfLocals.reserve(refsToLocals.size())
。它将最小化副本和堆分配。
看来,显而易见的方法是从 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());
}
我有一个本地 std::vector<std::reference_wrapper<T> >
,现在我想 return 其元素的 真实副本 (即 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;
}
您可以这样使用 std::copy
:
std::copy(
refsToLocals.begin(),
refsToLocals.end(),
std::back_inserter(copyOfLocals));
一定要使用调用copyOfLocals.reserve(refsToLocals.size())
。它将最小化副本和堆分配。
看来,显而易见的方法是从 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());
}