Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Set_intersection bei Maps. Gemeinsame Values rausfinden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.03.2006, 22:07 Uhr
~FuzzyBuzzy
Gast


Hallo zusammen,

ich hab folgendes Problem..und zwar möchte ich gerne set_intersection auf zwei maps anwenden um so die gemeinsamen values beider maps rauszufinden und diese in ein set zu speichern. Mein bisheriger Ansatz sieht wie folgt aus:


C++:
map<double,string> myMap1, myMap2;
set<string> entries;

//füllen von myMap1 & myMap2

set_intersection( myMap1.begin(), myMap1.end(), myMap2.begin(), myMap2.end(),
         inserter( entries, entries.end() ),myMap1.key_comp() );



so..aber ich erhalte immer eine Fehlermeldung beim Compilieren. Kann mir jemand sagen wo der Fehler liegt bzw. wie der Code richtig auszusehen hat ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.03.2006, 22:48 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wenn du uns den fehler noch posten könntest wärs einfacher
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.03.2006, 23:24 Uhr
Spacelord
Hoffnungsloser Fall


Hallo,
was soll denn inserter sein?

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.03.2006, 10:09 Uhr
~FuzzyBuzzy
Gast


so..hier ist sie...

g++ -O0 -g3 -Wall -c -fmessage-length=0 -oMainMenu.o ../MainMenu.cpp
/usr/include/c++/4.0.2/bits/stl_algo.h: In function ‘_OutputIterator std::set_intersection(_InputIterator1, _InputIterator1, _InputIterator2, _InputIterator2, _OutputIterator, _Compare) [with _InputIterator1 = std::_Rb_tree_iterator<std::pair<const double, std::string> >, _InputIterator2 = std::_Rb_tree_iterator<std::pair<const double, std::string> >, _OutputIterator = std::insert_iterator<std::set<std::string, std::less<std::string>, std::allocator<std::string> > >, _Compare = std::less<double>]’:
../MainMenu.cpp:367: instantiated from here
/usr/include/c++/4.0.2/bits/stl_algo.h:4281: error: no match for call to ‘(std::less<double> (std::pair<const double, std::string>&, std::pair<const double, std::string>&
/usr/include/c++/4.0.2/bits/stl_function.h:226: note: candidates are: bool std::less<_Tp>::operator()(const _Tp&, const _Tp& const [with _Tp = double]
../MainMenu.cpp:367: instantiated from here
/usr/include/c++/4.0.2/bits/stl_algo.h:4283: error: no match for call to ‘(std::less<double> (std::pair<const double, std::string>&, std::pair<const double, std::string>&
/usr/include/c++/4.0.2/bits/stl_function.h:226: note: candidates are: bool std::less<_Tp>::operator()(const _Tp&, const _Tp& const [with _Tp = double]
../MainMenu.cpp:367: instantiated from here
/usr/include/c++/4.0.2/bits/stl_algo.h:4287: error: no match for ‘operator=’ in ‘__result. std::insert_iterator<_Container>::operator* [with _Container = std::set<std::string, std::less<std::string>, std::allocator<std::string> >]() = __first1. std::_Rb_tree_iterator<_Tp>::operator* [with _Tp = std::pair<const double, std::string>]()’
/usr/include/c++/4.0.2/bits/stl_iterator.h:531: note: candidates are: std::insert_iterator<_Container>& std::insert_iterator<_Container>::operator=(typename _Container::const_reference) [with _Container = std::set<std::string, std::less<std::string>, std::allocator<std::string> >]
/usr/include/c++/4.0.2/bits/stl_iterator.h:491: note: std::insert_iterator<std::set<std::string, std::less<std::string>, std::allocator<std::string> > >& std::insert_iterator<std::set<std::string, std::less<std::string>, std::allocator<std::string> > >::operator=(const std::insert_iterator<std::set<std::string, std::less<std::string>, std::allocator<std::string> > >&
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.03.2006, 10:10 Uhr
~FuzzyBuzzy
Gast



Code:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -oMainMenu.o ../MainMenu.cpp
/usr/include/c++/4.0.2/bits/stl_algo.h: In function ‘_OutputIterator std::set_intersection(_InputIterator1, _InputIterator1, _InputIterator2, _InputIterator2, _OutputIterator, _Compare) [with _InputIterator1 = std::_Rb_tree_iterator<std::pair<const double, std::string> >, _InputIterator2 = std::_Rb_tree_iterator<std::pair<const double, std::string> >, _OutputIterator = std::insert_iterator<std::set<std::string, std::less<std::string>, std::allocator<std::string> > >, _Compare = std::less<double>]’:
../MainMenu.cpp:367:   instantiated from here
/usr/include/c++/4.0.2/bits/stl_algo.h:4281: error: no match for call to ‘(std::less<double>) (std::pair<const double, std::string>&, std::pair<const double, std::string>&)’
/usr/include/c++/4.0.2/bits/stl_function.h:226: note: candidates are: bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = double]
../MainMenu.cpp:367:   instantiated from here
/usr/include/c++/4.0.2/bits/stl_algo.h:4283: error: no match for call to ‘(std::less<double>) (std::pair<const double, std::string>&, std::pair<const double, std::string>&)’
/usr/include/c++/4.0.2/bits/stl_function.h:226: note: candidates are: bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = double]
../MainMenu.cpp:367:   instantiated from here
/usr/include/c++/4.0.2/bits/stl_algo.h:4287: error: no match for ‘operator=’ in ‘__result. std::insert_iterator<_Container>::operator* [with _Container = std::set<std::string, std::less<std::string>, std::allocator<std::string> >]() = __first1. std::_Rb_tree_iterator<_Tp>::operator* [with _Tp = std::pair<const double, std::string>]()’
/usr/include/c++/4.0.2/bits/stl_iterator.h:531: note: candidates are: std::insert_iterator<_Container>& std::insert_iterator<_Container>::operator=(typename _Container::const_reference) [with _Container = std::set<std::string, std::less<std::string>, std::allocator<std::string> >]
/usr/include/c++/4.0.2/bits/stl_iterator.h:491: note:                 std::insert_iterator<std::set<std::string, std::less<std::string>, std::allocator<std::string> > >& std::insert_iterator<std::set<std::string, std::less<std::string>, std::allocator<std::string> > >::operator=(const std::insert_iterator<std::set<std::string, std::less<std::string>, std::allocator<std::string> > >&)


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.03.2006, 11:15 Uhr
(un)wissender
Niveauwart


Tja die Typen der gespeicherten Werte sind unterschiedlich <string> <double,string> und können deshalb nicht verglichen werden.
Musst einen eigenen Comparator schreiben.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.03.2006, 16:27 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
das liest der Threadersteller wahrscheinlich garnicht mehr aber die Frage war mal nen gelungener Anlass mich mal endlich eingehender mit Iteratoren zu beschäftigen .
Das Problem ist das set_intersection versucht Elemente vom Typ std::pair<const double,std::string> in nen set zu packen das std::strings aufnimmt.
Der folgende Iterator übernimmt die Aufgabe aus dem pair den zweiten Wert zu ziehen und diesen in das set einzufügen.

cross_inserter.h

C++:
#ifndef __CROSS_INSERTER_H
#define __CROSS_INSERTER_H

#include <iterator>
#include <map>
#include <set>

template <class T1_,class T2_>
class cross_inserter
    :public std::iterator<std::output_iterator_tag,void,void,void,void>
{
public:
    explicit cross_inserter(std::set<T2_>* s_)
        :value_set(s_){}
    cross_inserter& operator= (std::pair<const T1_,T2_> p_)
    {
        value_set->insert(p_.second);
        return *this;
    }
    cross_inserter& operator*()        {return *this;}
    cross_inserter& operator++()    {return *this;}
    cross_inserter& operator++(int)    {return *this;}
private:
    std::set<T2_>* value_set;
};

#endif



zum Testen

C++:
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include "cross_inserter.h"
using namespace std;

int main()
{
    map<double,string> myMap1, myMap2;
    set<string> entries;

    myMap1.insert(make_pair(1.0,"eins"));
    myMap1.insert(make_pair(2.0,"zwei"));
    myMap1.insert(make_pair(3.0,"drei"));
    myMap1.insert(make_pair(5.0,"fuenf"));
    myMap1.insert(make_pair(13.0,"dreizehn"));

    myMap2.insert(make_pair(1.0,"eins"));
    myMap2.insert(make_pair(17.0,"drei"));
    myMap2.insert(make_pair(5.0,"fuenf"));
    myMap2.insert(make_pair(12.7,"fuenf"));

    cross_inserter<double,string> ci(&entries);

    set_intersection( myMap1.begin(), myMap1.end(), myMap2.begin(), myMap2.end(),ci);
    cout<<entries.size()<<" Elemente in set1 eingefuegt."<<endl;
    for(set<string>::iterator it = entries.begin();it!=entries.end();++it)
        cout<<*it<<" wurde eingefuegt."<<endl;

    return 0;
}


Das Ganze bietet mir für die Zukunft auch nen schönen Rahmen um nen bißchen mit Policies rumzuspielen und so das Ganze deutlich generischer zu gestalten.
In diesem Sinne muss ich mich bei dem Fragesteller noch bedanken für dieses (zumindest für mich) interessante Thema .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: