c ++ std :: map <std :: string,std :: set <std :: string =“”>&gt; 。如何循环设定值?

时间:2015-12-05 20:04:32

标签: c++ c++11 dictionary set

我在c ++中用std::map<std::string, std::set<std::string>>声明了一个集合。如何循环访问或打印设定值?

2 个答案:

答案 0 :(得分:2)

如果你知道如何单独迭代std::mapstd::set,那么你应该没有麻烦地将它们组合起来。请注意,如果您使用基于范围的std::map循环迭代for,那么您将std::pair<K, V>重复K,其中constV - 限定键的类型和#include <iostream> #include <map> #include <set> #include <string> int main() { auto stuff = std::map<std::string, std::set<std::string>> { {"fruits", {"apple", "banana", "orange"}}, {"vegetables", {"carrot", "cucumber"}}, {"nuts", {"peanut", "walnut", "hazelnut", "coconut"}}, }; // Iterate over a single set for (const auto& s : stuff["fruits"]) std::cout << s << "\n"; std::cout << "\n"; // Iterate over the whole data structure for (const auto& pair : stuff) { std::cout << pair.first << ":"; for (const auto& s : pair.second) std::cout << " " << s; std::cout << "\n"; } } 值的类型。如果您只想迭代单个集合(与单个键相关联),只需访问该元素并正常迭代它。

apple
banana
orange

fruits: apple banana orange
nuts: coconut hazelnut peanut walnut
vegetables: carrot cucumber

输出:

CharField

答案 1 :(得分:1)

假设你有一个std::map<std::string, std::set<std::string>>,你可以打印包含set s的元素,并带有一个双范围for循环,如下例所示:

std::map<std::string, std::set<std::string>> mp {{"1", {"1", "2", "3"}}, 
                                                 {"2", {"4", "5", "6"}}};

for(auto &&p : mp) {
  for(auto &&s : p.second) std::cout << s << " ";
  std::cout << std::endl;
}

Live Demo

或者如果你想要一些更令人印象深刻的东西给你的老板留下深刻印象,你可以使用std::copystd::ostream_iterator的单一远程循环:

std::map<std::string, std::set<std::string>> mp {{"1", {"1", "2", "3"}}, 
                                                 {"2", {"4", "5", "6"}}};

for(auto &&p : mp) {
  std::copy(std::begin(p.second), std::end(p.second), 
            std::ostream_iterator<std::string>(std::cout," "));
  std::cout << std::endl;
}

Live Demo

编辑:

  

目标是我们有一个表格,其中包含相机名称和规格   {的std ::地图&GT; cameraSpec {{“camera1,   {“Spec1”,“Spec2”,“Spec3”}},{“camera2”,{“Spec2”,“Spec4”,   “Spec6”}}};我想编写一个代码来检查哪个规范   对用户非常满意吗?类似于找到的东西   来自给定表格的单词的频率。如何访问规格?

如何访问地图的各个元素

假设您要访问地图中的现有元素(即,您确定特定密钥存在)。您可以通过以下方式使用map的下标运算符:

for(auto &&s : mp["camera2"]) {
  // you loop over elements {"spec2", "spec4", "spec6"}
}

也就是说,mp["camera2"]会在地图中设置参考值,设置为“camera2”下的值{"spec2", "spec4", "spec6"}

如果您不确定地图中是否存在密钥,请使用成员函数map::find。也就是说,首先查询地图是否存在您要查找的特定键,然后以与上面所示相同的方式访问值/集的元素:

auto it = mp.find("camera2");
if(it != mp.end()) {
  for(auto &&s : it->second) {
    // you loop over elements {"spec2", "spec4", "spec6"}
  }
}

请注意,如果地图中存在键“camera2”,则map::find将返回指向与该特定键关联的元素的迭代器。

现在,地图的元素属于std::pair<const key_type, value_type>类型(在我们的案例中为std::pair<const std::string, std::set<std::string>>)。

如果未找到密钥,std::map::find将返回指向一个迭代器的迭代器传递地图的结束元素。

std::pair有两位成员std::pair::firststd::pair::second。在我们的例子中,std::pair::first值等于键的值(即“cammera2”),std::pair::second等于该键下的值(即std::set{"spec2", "spec4", "spec6"} 1}})。这就是为什么在上面显示的循环中我们迭代it->second(即关键字“cammera2”下的值/设置)。