我试图创建一个类,它维护一个固定大小的唯一指向管理对象的指针向量,如下所示:
std::vector<std::unique_ptr<Myclass>> myVector;
vector像这样初始化:
myVector.resize(MAX_OBJECTS,nullptr);
现在,我需要做的是,能够,根据请求,删除一个存储的唯一指针,而不影响vector的大小。
我还需要安全地向vector中添加元素,而不使用push_back或emplace_back。
提前感谢。
编辑:我希望向量的大小恒定,因为我希望能够在恒定的时间内添加和删除元素。
如果你想要一个固定大小的向量,使用std::array
要删除索引中的unique_ptr,可以使用std::unique_ptr::reset()
:
myVector[i].reset()
要添加一个元素到一个特定的索引(覆盖之前的内容),你可以使用std::unique_ptr::reset()
和新的指针作为参数:
myVector[i].reset(new Myptr(myparameter));
阅读参考文献也有帮助:
- http://en.cppreference.com/w/cpp/memory/unique_ptr
- http://en.cppreference.com/w/cpp/container/array
- http://en.cppreference.com/w/cpp/container/vector
看起来您想使用std::array<>
而不是强迫std::vector<>
表现得像一个。
前面已经指出,如果大小是固定的,你应该使用std::array
。
例如:
std::array<std::unique_ptr<YourType>, MAX_OBJECTS> myVector;
你可以像这样删除或添加一个新的指针。
for(auto& v : myVector)
if(v && predicate)
v.reset();// or v.reset(ptr) to set a new one
可以使用STL算法std::remove,如下所示:
// all items that should be removed will be the range between removeAt and end(myVector)
auto removeAt = std::remove_if(begin(myVector), end(myVector),
ShouldRemovePredicate);
// reset all items that should be removed to be nullptr
for(auto it = removeAt; it != end(myVector); ++it)
it->reset();
此外,如果大小在编译时已知,我建议使用std::array<unique_ptr<MyObject>, SIZE>
而不是vector。但是,如果您的代码在编译时不知道SIZE,则没有问题。
您可以使用std::array
而不是std::vector
,因为您事先知道元素的数量,您可以添加和删除元素,如以下示例:
#include <iostream>
#include <memory>
#include <array>
class foo {
std::size_t id;
public:
foo() : id(0) {}
foo(std::size_t const _id) : id(_id) {}
std::size_t getid() const { return id; }
};
auto main() ->int {
// construct an array of 3 positions with `nullptr`s
std::array<std::unique_ptr<foo>, 3> arr;
// fill positions
std::unique_ptr<foo> p1(new foo(1));
arr[0] = std::move(p1);
std::unique_ptr<foo> p2(new foo(2));
arr[1] = std::move(p2);
std::unique_ptr<foo> p3(new foo(3));
arr[2] = std::move(p3);
// print array
for(auto &i : arr) if(i != nullptr) std::cout << i->getid() << " ";
std::cout << std::endl;
// reset first position (i.e., remove element at position 0)
arr[0].reset();
// print array
for(auto &i : arr) if(i != nullptr) std::cout << i->getid() << " ";
std::cout << std::endl;
return 0;
}