【问题标题】:Creating std::vector of nonmovable type创建不可移动类型的 std::vector
【发布时间】:2019-03-01 22:15:46
【问题描述】:

我有一个名为argsstd::vector(我不知道编译时向量的大小)和一个不可移动的类型NonMoveable

我想创建一个与 args 大小相同的向量,使其等于 {NonMovable(args[0], additional_arg), NonMovable(args[1], additional_arg), …, NonMovable(args.back(), additional_arg)}

我以后不需要更改向量的大小。我该怎么做?

我不能reserve() 然后emplace_back() 因为emplace_back() 需要移动(以允许重新分配,这在我的情况下是不可能的)

我不想使用std::list,因为它不连续。

【问题讨论】:

  • @BaummitAugen emplace_back() 需要 MoveInsertable(reserve 不需要)
  • 你不想使用 unique_ptr?
  • @andreaplanet,我知道这个选项,但我不想
  • 为什么不用std::deque,不需要可移动的?
  • 那么 std::deque::emplace_back 呢?

标签: c++ vector stl c++17


【解决方案1】:

你可以:

  • 有一个vector<unique_ptr<T>>vector<optional<T>>vector<some_other_defer_storage_mechanism<T>> 而不仅仅是vector<T> - 这些都是添加一些功能T 而不影响T 的包装器类型(unique_ptr<T> 使其可移动,@987654329 @ 确保默认构造,因此您可以使用正确的大小构造,然后在 optional 内构造 emplace() 等)
  • 使用deque<T>,它不需要emplace_back 的可移动性(尽管你失去了连续性)
  • 编写您自己的动态数组,它大致相当于pair<unique_ptr<T[]>, size_t>,它只为n Ts 分配空间,然后将placement-news 分配给它们,确保销毁做正确的事情。这实施起来还不错 - 由于您不会更改大小,因此您需要支持非常少量的整体操作。

其中哪一个是最佳答案真的取决于。

【讨论】:

  • 可选对我来说似乎是最佳选择。
  • std::optional 在这种情况下不起作用。即使它有一个默认构造函数,如果它是不可移动/可复制的,std::optional 本身也不会。并且唯一指针向量仅确保唯一指针本身的连续性,而不是实际对象。
  • @SamVarshavchik std::optional 将工作 just fine。但列出一堆选项的真正意义在于,我并不确切知道 OP 需要什么。
【解决方案2】:

如果您希望元素是连续的,您可以使用旧的 2 次动态数组构造:

// allocate a dynamic array
NonMoveable *mv = std::allocator<NonMoveable>().allocate(args.size());

// use inplace new to construct the NonMoveable elements
for (unsigned int i = 0; i < args.size(); i++) {
    new(mv + i) NonMoveable(args[i], additional_arg);
}

...  // use the dynamic array

// Explicitely delete the elements
for (unsigned int i = 0; i < args.size(); i++) {
    mv[i].~NonMoveable();
}

// and de-allocate
std::allocator<NonMoveable>().deallocate(mv, args.size());

它相当 C-ish,但满足连续要求。当然,这应该封装在自定义容器中,以便在容器销毁时自动销毁和取消分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 2014-07-21
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多