【问题标题】:Find value of index in Map Array using string key使用字符串键在 Map Array 中查找索引值
【发布时间】:2017-02-12 20:33:04
【问题描述】:

在数组map<string, int> bannd 中,每个键(字符串类型)都保存一个数值,像这样

+++++++++++++++
key   |  value
+++++++++++++++
red   |   0
blue  |   1
orange|   3

等等……

使用键返回索引值的最佳方式是什么?

我已经尝试过像这样使用 find

band1 = band.find("a");

其中 a 是映射中的键值,但它似乎不起作用。

【问题讨论】:

  • std::map::at 请注意,假设我们正在谈论std::mapfind 返回在 map 中您可以找到您要查找的项目的位置,如果未找到,则返回结束迭代器。

标签: c++ dictionary maps


【解决方案1】:

find 返回一个 iterator 指向找到的键值对 pair(如果有的话)。您必须取消引用该迭代器以获取实际的映射值:

int band1;
auto it = band.find("a");
if (it != band.end())
  band1 = it->second;
else
  /* not found ... */;

请注意,*it 只是为我们提供了包含键和映射值的 std::pair。要访问映射值本身,我们使用it->second

或者,如果您知道键在map 中,您可以使用at 来获取该键的映射值:

int band1 = band.at("a");

at 如果找不到该元素,将抛出out_of_range 异常。

最后,如果您想使用键 "a" 访问该值,并且希望将该键自动添加到 map 中(如果它不存在),则可以使用下标运算符 []

int band1 = band["a"]; //warning: inserts {a, 0} into the map if not found!

【讨论】:

    【解决方案2】:

    编写一个函数,以key的std::mapstd::vector为参数。并且会返回std::vector中对应的值

    vector<int> valueReturn(map<string,int> data, vector<string> key) {
        vector<int> value;
        for(const auto& it: key) {
            auto search = data.find(it);
            if(search != data.end()) {
                value.push_back(data[it]);
                std::cout << "Found " << search->first << " " << search->second << '\n';
            }
            else {
                value.push_back(-1); // Inserting -1 for not found value, You can insert some other values too. Which is not used as value
                std::cout << "Not found\n";
            }
        }
        return value;
    }
    

    【讨论】:

    • 我不明白你回答的逻辑。 OP 只想要一个int
    • @user4581301 :因为不能从函数返回多个值。因此我返回一个std::vector&lt;int&gt;
    • 问题中没有任何地方说 OP 想要多个值。 std::map 不支持多个键。你会想要一个std::multimap
    • @user4581301 :我想你误解了我的意思。 OP 想要输入 a,b,c,d 的值 (band1,2,3,4) 对吗?我将 map 和 key 作为输入并返回相应的值。
    • 好的。我知道你从哪里来,并认为你过于复杂化并冒着大量不必要的复制风险。从好的方面来说,额外的副本可以防止遇到 Brian 遇到的同样问题。 operator[] 只会在使用未知键时将新元素插入到映射副本中。
    【解决方案3】:
    int band1 = band["a"];
    int band2 = band["b"];
    int band3 = band["c"];
    int band4 = band["d"];
    

    【讨论】:

    • 这具有将项目添加到map 并返回新项目的默认值的副作用,在这种情况下,如果项目不在map 中,则返回0。可能不是 OP 想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2016-02-15
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多