获取map <string,vector <string>&gt; </string,vector <string>的键

时间:2013-03-10 11:05:56

标签: c++

我如何获得map<string,vector<string>>mymap这样的地图mymap["index"]={"val1","val2"}的密钥?我在这里找到了像map<string,string>这样的普通地图的解决方案,但为此我不知道该怎么做。

2 个答案:

答案 0 :(得分:6)

您可以遍历地图中的所有值(这些是对)并引用它们的第一个和第二个元素分别获取键和映射值:

#include <map>
#include <vector>
#include <string>

int main()
{
    std::map<std::string, std::vector<std::string>> m;
    // ...
    for (auto& p : m)
    {
        std::string const& key = p.first;
        // ...

        std::vector<std::string>& value = p.second;
        // ...
    }
}

当然,您可以使用std::for_each来实现相同的目标:

#include <map>
#include <vector>
#include <string>
#include <algorithm>

int main()
{
    std::map<std::string, std::vector<std::string>> m;
    // ...
    std::for_each(begin(m), end(m), [] (
        std::pair<std::string const, std::vector<std::string>>& p
        //                    ^^^^^
        //                    Mind this: the key is constant. Omitting this would
        //                    cause the creation of a temporary for each pair
        )
    {
        std::string const& key = p.first;
        // ...

        std::vector<std::string>& value = p.second;
        // ...
    });
}

最后,你也可以推出自己的手册for循环,不过我个人认为这不太习惯:

#include <map>
#include <vector>
#include <string>

int main()
{
    std::map<std::string, std::vector<std::string>> m;
    // ...
    for (auto i = begin(m); i != end(m); ++i)
    {
        std::string const& key = i->first;
        // ...

        std::vector<std::string>& value = i->second;
        // ...
    }
}

这就是上面的最后一个例子在C ++ 03中的样子,其中不支持通过auto进行类型推导:

#include <map>
#include <vector>
#include <string>

int main()
{
    typedef std::map<std::string, std::vector<std::string>> my_map;
    my_map m;

    // ...
    for (my_map::iterator i = m.begin(); i != m.end(); ++i)
    {
        std::string const& key = i->first;
        // ...

        std::vector<std::string>& value = i->second;
        // ...
    }
}

答案 1 :(得分:3)

地图在内部保存std::pair<key_type, mapped_type>,因此迭代地图可让您通过it->first访问密钥,其中it是迭代器。

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

for (auto it = m.cbegin(), it != m.cend(); ++it)
  std::cout << "key " << it->first << std::endl;

基于范围的循环版本是

for (const auto& stuff : m)
  std::cout << "key " << stuff.first << std::endl;