9

是否std::unique_ptr使C++11/14 中的Boost.Pointer Container库过时?

在 C++98/03 中没有移动语义,如果与原始指针相比,智能指针之类shared_ptr的具有引用计数相关的开销(对于 ref 计数块和互锁递增/递减)。std::vector<shared_ptr<T>>因此,与 相比,类似的东西有开销std::vector<T*>

但是是否与(没有引用计数开销)std::vector<std::unqiue_ptr<T>>一样有效,并且在异常和自动销毁方面也很安全(即析构函数将自动调用其指针存储在 中的项目的析构函数)?std::vector<T*>vector<unique_ptr<T>>Tvector

如果是这样,Boost.Pointer Container 在 C++11/14 代码中是否仍然有用,还是已经过时了?

4

3 回答 3

10

它并不过时;它有一个完全不同且更直观的界面std::vector<std::unique_ptr<T>>

于 2013-07-15T15:10:38.083 回答
6

正如 James 在他的回答中提到的那样,与将 a 粘贴unique_ptr到标准库容器中相比,Boost.Pointer 容器提供了更直观的界面。

除此之外,boost::ptr_vector<T>(和朋友)将指向的类型存储为void *下面,因此您不会为每个T. 情况并非如此vector<unique_ptr<T>>

于 2013-07-15T15:17:02.357 回答
1

尝试使用std::vector<std::unqiue_ptr<T>>

struct Foo {
    int a;
};


vector<unique_ptr<Foo>> bar;
bar.push_back(make_unique<Foo>(1));
cout << bar[0]->a << endl; // rvalue, is ok
Foo *foo = bar[1].get(); // try to use a pointer, this interface "bar[1].get()" is awful

Boost.Pointer Container 当然有更直观的界面。

于 2019-09-13T02:47:35.813 回答