gpt4 book ai didi

c++ - 使用迭代器访问 vector> 的元素?

转载 作者:行者123 更新时间:2023-11-30 03:51:20 24 4
gpt4 key购买 nike

我有一个类成员变量作为

vector<std::unique_ptr<T> > v;

和我想使用 unique_ptr 的成员函数v 的元素由iterator“寻址”争论。哪一个更好?

void mem_fun(vector<std::unique_ptr<T> >::iterator it) {
std::unique_ptr<T> p;
p = std::move(*it);
...
}

或者

void mem_fun(vector<std::unique_ptr<T> >::iterator it) {
std::unique_ptr<T>& p = *it;
...
}

据我所知,第二种方式似乎违反了 unique_ptr 的“唯一性”。 .但是可以std::move() move *it (引用)?顺便说一句,谁真正拥有 unique_ptr指针、类、成员 vector 、任何成员函数或其他什么?

最佳答案

post from Herb Sutter包含回答您问题的知识。

unique_ptr实际上定义了“所有权证书”。此所有权不可复制。当你move unique_ptr , 这有效地破坏了存储在` vector 中的证书。

因此,vector<unique_ptr<T>> 拥有 T

当你只想用 T 做事时s,你应该将你的函数声明为

void mem_fun(T& t) { ... }

并将取消引用委托(delegate)给另一个函数:

template<typename It, typename F>
void foreach_deref(It from, It to, F f) {
std::for_each(from, to, [&](decltype(*from) &pt) {
f(*pt);
}
}

并使用它来调用您的成员函数:

foreach_deref(begin(v), end(v), [&](T& t) { mem_fun(t); });

关于c++ - 使用迭代器访问 vector<std::unique_ptr<T>> 的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31309708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com