【问题标题】:Which is the best way to initialize a std::map whose value is a std :: vector?哪个是初始化值为 std :: 向量的 std::map 的最佳方法?
【发布时间】:2023-03-27 02:09:01
【问题描述】:

我有以下几点:

std::map<std::string, std::vector<std::string>> container;

要添加新项目,我执行以下操作:

void add(const std::string& value) {
    std::vector<std::string> values;
    values.push_back(value);
    container.insert(key, values);
}

有没有更好的方法来增加价值?

谢谢

【问题讨论】:

  • 你的做法有什么问题?
  • map::insert 需要一对,所以你需要std::make_pair(key, values) 或构造函数std::pair&lt;std::string, std::vector&lt;std::string&gt; &gt;(key, values)
  • 这里没有初始化地图。您真的想了解初始化吗?
  • 你应该定义“更好”...

标签: c++ c++11 vector map stl


【解决方案1】:

首先,std::map 持有 std::pairs 的 key-value。您需要插入其中一对:。其次,您不需要制作临时向量。

container.insert(make_pair(key, std::vector<std::string>(1, value)));

您可以使用大括号括起来的初始值设定项来表达上述内容:

container.insert({key, {value}});

请注意,std::map::insert 只有在没有具有相同键的元素时才会成功。如果要覆盖现有元素,请使用operator[]

container[key] = {value};

【讨论】:

    【解决方案2】:

    使用初始化器列表 (C++11),您只需执行 container.insert({key, { value }}); 即可,其中 {value} 将构建 std::vector{key, {value}} 将构建 std::pair

    【讨论】:

    • 插入一对需要一个参数,你需要另一对大括号。
    • 有没有办法使用std::make_pair(key, {s1, s2, s3}); 做同样的事情?
    • @CaptainDaVinci 是的,但是由于编译器无法知道{s1,s2,s3} 的类型是什么,您需要指定它:std::make_pair&lt;std::string, std::vector&lt;std::string&gt;&gt;("test", {"a", "b", "c"})
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多