Pergunta

Eu estou tentando saltar através de algumas aros para organizar os dados de uma maneira especial. Estou incluindo uma peça simplificada do código que demonstra a minha dor.

Eu não posso usar impulso. Eu estou usando a última versão do g ++ em cygwin.

#include <iostream>
#include <map>

using namespace std;

int main () {

    map< int,int > genmap;
    map< int,int >::iterator genmapit;
    map< map<int,int>::iterator,int > itermap;

    // insert something into genmap
    genmap.insert (make_pair(1,500) );

    // find and return iterator.
    genmapit=genmap.find(1);

    // insert the iterator/int into itermap. Dies on each of the following 3 versions of this line.
    //itermap[genmapit] = 600; // crash
    //itermap.insert ( pair< map<int,int>::iterator,int >(genmapit,600) ); // crash
    itermap.insert ( make_pair(genmapit,600) ); // crash

    return 0;
}

Então, como você pode ver, eu tenho um mapa simples, um iterador para esse mapa e outro mapa que tem o primeiro argumento como um iterador para o primeiro mapa.

É claro a partir desta: Por que eu não posso colocar um iterador no mapa? Que eu possa ter um iterador como o segundo argumento. No entanto, a forma como mostrado acima fornece o seguinte:

$ make
g++    -c -o main.o main.cpp
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h: In member fun
ction `bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp =
 std::_Rb_tree_iterator<std::pair<const int, int> >]':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_tree.h:871:   instantiate
d from `std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _All
oc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::i
nsert_unique(const _Val&) [with _Key = std::_Rb_tree_iterator<std::pair<const in
t, int> >, _Val = std::pair<const std::_Rb_tree_iterator<std::pair<const int, in
t> >, int>, _KeyOfValue = std::_Select1st<std::pair<const std::_Rb_tree_iterator
<std::pair<const int, int> >, int> >, _Compare = std::less<std::_Rb_tree_iterato
r<std::pair<const int, int> > >, _Alloc = std::allocator<std::pair<const std::_R
b_tree_iterator<std::pair<const int, int> >, int> >]'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_map.h:360:   instantiated
 from `std::pair<typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_
Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator, bool> std::
map<_Key, _Tp, _Compare, _Alloc>::insert(const std::pair<const _Key, _Tp>&) [wit
h _Key = std::_Rb_tree_iterator<std::pair<const int, int> >, _Tp = int, _Compare
 = std::less<std::_Rb_tree_iterator<std::pair<const int, int> > >, _Alloc = std:
:allocator<std::pair<const std::_Rb_tree_iterator<std::pair<const int, int> >, i
nt> >]'
main.cpp:23:   instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:227: error: no
 match for 'operator<' in '__x < __y'
make: *** [main.o] Error 1

"instanciado a partir daqui" não me diz nada e uma pesquisa na web me dá nenhuma informação sobre isso.

O STL: simplesmente não mapa permitir isso? I pode recodificar meu aplicativo Para contornar isso, mas vai ser muito ineficiente e eu gostaria de começar este trabalho. Existe outro tipo de ponteiro que posso fazer para um elemento do mapa eu poderia usar?

Obrigado pelo seu tempo.

Foi útil?

Solução

Você não pode fazer isso porque iterators std::map são iteradores de acesso não aleatórios de modo não são comparáveis ??com <.

Em vez disso, você poderia usar ponteiros para o value_type no primeiro mapa como uma chave do mapa.

Outras dicas

Você tem que aprender a ler as mensagens de erro. Em olhar particular na mensagem que vem após a descrição prolixo , onde o erro aconteceu:

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:227: error: no match for 'operator<' in '__x < __y'

Mapa iteradores não são comparáveis ??com menos do que operador qual o mapa usa por padrão.

Eu suponho que você pode fornecer uma função de comparação que compara os pares apontado pelo iterador, já que os iteradores em si não pode ser facilmente comparada de uma forma significativa.

struct CompareIterator
{
     template <class FirstIter, class SecondIter>
     bool operator()(FirstIter lhv, SecondIter rhv) const
     {
         return *lhv < *rhv;
     }
};

//usage with map:
map< map<int,int>::iterator,int, CompareIterator > itermap;

define std::pair operator<. Eu também usei dois tipos de iterador, uma vez que pode ser possível os tipos são diferentes (iterator e const_iterator)

map<Key, Value>

O map iterator como elemento chave em outro map não é possível porque espera map operator < a ser definido por padrão para a chave. Se o Key (neste caso map iterator) não está definido, então você precisa passar um functor como uma função predicado que fornece a comparação de Key (mapa iterator).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top