如何打印std :: set of std :: maps

时间:2017-03-27 08:31:32

标签: c++ c++11 stdmap stdset

这是带有字符串键和结构值的映射 1.首先,我创建一个整数映射和一个结构值作为值 std::map<int,struct value>;然后我将所有这些地图对象添加到一个集合中  std::set<std::map<int,struct value>>我希望了解如何遍历此集合 我无法访问此套装中的地图,请建议

struct values
{
    std::string a;
    std::string b;
    values():a("milepost"),b("dummyval"){};
    values( std::string ab, std::string bc)
    {
        a=ab;
        b=bc;
    };

    bool operator<(const values& other) const {
        return (a< other.a && b < other.b) ;
    }
    friend std::ostream& operator<<(std::ostream& os, const values& val);

};

std::ostream& operator<< (std::ostream& os , const values& val)
{
  os << val.a <<"\t"<< val.b;
  return os;

}

typedef std::map<std::string,values>  myWsData;

main() 
{
    values a;

    myWsData et_Data1,pt_Data2;

    et_Data2.insert(std::make_pair("780256", a));

    pt_Data2.insert(std::make_pair("780256", a));

    std::set<myWsData> myet_pt_data;

    myet_pt_data.insert(et_Data1);

    myet_pt_data.insert(pt_Data2);

    for (auto &i:myet_pt_data)
    {
        std::cout<<i<<"\n";
    }
}

3 个答案:

答案 0 :(得分:2)

你必须使用两个循环,如:

for (auto const& it1 : myet_pt_data)
{
    for (auto const& it2 : it1)
    {
       std::cout << it2.first << '\t' << it2.second << std::endl;
    }
}

range-based for loops中使用auto const&时,请避免复制该集及其所有内容。 类型如下:

  • decltype(it1)std::map<std::string,values> const&
  • decltype(it2)std::pair<std::string const,values> const&

为了完整起见,请注意std::string中的it2std::pair)是常量。

答案 1 :(得分:1)

你可能错过了一个内循环:

// iterates through all elements of the set:
for (const auto& the_map : myet_pt_data)
{
    // the_map takes all values from the set
    // the_map actual type is const std::map<std::string,values>&
    for (const auto& the_value : the_map)
    {
       // the_value takes all value of the current map (the_map)
       // the_value actual type is const std::pair<std::string,values>&
       std::cout << the_value.first << " value is " << the_value.second << std::endl;
    }
}

答案 2 :(得分:1)

这个怎么样:

#include <iostream>
#include <map>
#include <set>
#include <algorithm>

using namespace std;

int main(int argc, char *argv[])
{
    set<map<int,string> > list;
    //fill list
    std::for_each(list.begin(), list.end(), [](auto set_el){
        std::for_each(set_el.begin(),set_el.end(),[](auto map_el) {
            std::cout<<map_el.first<<"\t"<<map_el.second<<std::endl;
        });
    });
    cout << "Hello World!" << endl;
    return 0;
}