从唯一指针数组中移除唯一指针



我试图创建一个类,它维护一个固定大小的唯一指向管理对象的指针向量,如下所示:

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;
}

现场演示

相关内容

  • 没有找到相关文章

最新更新