【问题标题】:Inserting unique pointer into a std::map [closed]将唯一指针插入 std::map [关闭]
【发布时间】:2019-11-18 07:52:34
【问题描述】:

我在将一个唯一指针插入std::unordered_map时停止了。

当我寻找答案时,我得到了一个链接:C++ inserting unique_ptr in map

我试过了,但它对我不起作用。这是我到目前为止尝试的示例。

int main()
{
    unordered_map<string,unique_ptr<char[]>> mymap;
    string key = "ac";
    char* ctr = "myvalue";
    unique_ptr<char[]> value = make_unique<char[]>(100);
    memcpy(value.get(), ctr,5);
    mymap.insert_or_assign(key,std::move(value));
    return 0;
}

遇到编译问题。

【问题讨论】:

  • 你能发布你的编译错误吗?
  • 您的地图键是整数但key 是字符串?请发布minimal reproducible example 并附上完整代码和错误消息
  • 您是否有理由不使用std::vector 而不是std::unique_ptr&lt;char[]&gt;?或者,考虑到您的示例,std::string?
  • 在询问有关构建错误的问题时,请始终在问题本身中包含 fullcomplete 输出。并在出现错误的行上的minimal reproducible example 中添加 cmets。也请刷新how to ask good questions,以及this question checklist
  • @MartinBonnersupportsMonica 是的,我添加它是因为问题说它正在使用 std::map,当它由于实际使用 unordered_map 而没有编译时我忘了删除它,并没有改变结果虽然

标签: c++ c++17 smart-pointers unique-ptr unordered-map


【解决方案1】:

您的mymapint eger 作为键

unordered_map<int,unique_ptr<char[]>>  mymap
//            ^^^

你传递的keystd::string。显然,编译器不能接受。

您可能打算将std::string 作为键

std::unordered_map<std::string, std::unique_ptr<char[]>> mymap;
//                ^^^^^^^^^^^^

话虽如此,这里没有必要使用智能指针,而只是一个

std::unordered_map<std::string, std::string> mymap;

【讨论】:

  • 更新了代码key其实是一个字符串sorry
  • @DhanasekaranDon 如果是这样,就无法重现godbolt.org/z/KabHvY。我建议在问题中发布完整的错误消息。
【解决方案2】:

您不能在 STL 容器中使用唯一指针。仅转移所有权的唯一指针不共享此。 当您在 STL 容器中使用唯一指针时,可能会发生未定义的行为 复制容器会使源容器中的数据无效。

【讨论】:

  • 这根本不是真的。您肯定可以在 STL 容器中使用唯一指针。可以在 C++89 中实现唯一指针(参见 std::auto_ptr),问题是您不能在 STL 容器中使用它们。 C++11 引入了右值引用、std::move、std::unique_ptr,并使之成为可能。
  • 显然,您不能复制包含唯一指针的 STL 容器,但您当然可以移动它。
  • 是的,但在容器内进行复制。会产生失效
  • 垃圾。有一些复制的方法;它们不会编译,因为 std::unique_ptr 没有复制构造函数或复制赋值运算符,但总是有类似的方法可以代替。
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 2020-04-17
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多