如何迭代智能指针列表?



在Herb Sutter的2014 CppCon演讲中,他谈到如果你不打算转让或分享所有权,你不应该在函数声明中使用智能指针。最明确的是,不能使用const引用智能指针。

如果我有一个函数,它接受一个智能指针指向的元素,这很容易实现。你只需要:

void f(int& i) //or int*
{
i++;
}
int main()
{
auto numberPtr = std::make_unique<int>(42);
f(*numberPtr);
}

但是我想知道的是,是否有基于范围的循环的最佳实践?

int main()
{
auto numberPtrVec = std::vector<std::unique_ptr<int>>{};

for(int i = 0; i < 5; i++)
numberPtrVec.push_back(std::make_unique<int>(i));
for(auto& i : numberPtrVec)
{
//i++; would be the optimum
(*i)++; //dereferencing is necessary because i is still a reference to an unique_ptr
}
}

是否有办法直接捕获当前元素作为引用或原始指针?

对于我来说,处理对智能指针的引用总是感觉有点不对。

for-循环中获取一个引用作为第一项业务:

for(auto& i : numberPtrVec)
{
auto &n = *i;

,然后在循环的其余部分使用n

在c++ 20中,我建议使用std::ranges::transform(deref),其中derefstd::plus风格的操作符包装器。

对于c++ 17,您需要一个range库,例如range-v3的views::indirect:

#include <range/v3/view/indirect.hpp>
for(auto& i : numberPtrVec | ranges::views::indirect)
{
i++;
}

相关内容

  • 没有找到相关文章

最新更新