2017-03-27 2 views
1

Hier ist die Karte mit einem String-Schlüssel und einen Strukturwert 1. Zunächst eine Karte von Integer- und eine Struktur als Wert Ich schaffe std::map<int,struct value>; und dann alle diese Karte Objekte auf einen Satz std::set<std::map<int,struct value>> und ich möchte verstehen, wie diese eine Schleife durch stelle ich nicht in der Lage bin, die Karten zuzugreifen, die Teil dieses Satzes sind, schlagen Sie bittewie std :: set von std drucken :: Karten

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"; 
    } 
} 
+0

'Iam nicht in der Lage, die Karten zuzugreifen, die Teil dieser Set', beachten Sie bitte Detail .... was ist Ihr Problem: Zusammenstellung? Laufzeit? Was erlebst du, dass du sagst, dass es nicht funktioniert? – jpo38

+0

Sie haben ein Problem mit einem weniger als zwei Kartenvergleich, nicht wahr? Was versuchst du wirklich zu lösen? –

+1

@RichardHodges Ich denke (da er noch Lerner ist) sollten wir hinzufügen, dass der * less-than-Vergleich * notwendig ist, weil 'std: set' als * sortierte * Menge implementiert ist. Daher müssen wir eine Reihenfolge ihrer Elemente definieren, die dieser Code fehlt. – Christoph

Antwort

1

Sie sind wahrscheinlich Eine innere Schleife fehlt:

// 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

Sie sollten wahrscheinlich untersuchen, wie Sammlungen ohne das Erstellen von Provisorien iteriert werden. – rustyx

+0

@RustyX: Richtig, war zu schnell. Korrigiert das. – jpo38

2

Sie haben zwei Schleifen zu verwenden, etwa so:

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

Wenn Sie auto const& verwenden in Ihrem range-based for loops vermeiden Sie das Kopieren des Satzes und all seinen Inhalt. Die Typen sind wie folgt:

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

Der Vollständigkeit halber ist zu beachten, dass die std::string in it2 (die std::pair) const ist.

1

Wie wäre es damit:

#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; 
} 
Verwandte Themen