Pregunta

Estoy tratando de saltar a través de aros para organizar los datos de una manera especial.Estoy incluyendo una versión simplificada de la pieza de código que muestra mi dolor.

Yo no puedo usar el boost.Estoy usando la última versión de g++ en 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;
}

Así que como puedes ver, tengo 1 simple mapa, un iterador a ese mapa y otro mapa que tiene el primer argumento como un iterador al primer mapa.

Es claro a partir de este:¿Por qué no puedo poner un iterador en el mapa? Que puedo tener un iterador como segundo argumento.Sin embargo, la forma en que se muestra arriba proporciona esta:

$ 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 de aquí" me dice nada y una búsqueda en la web no me da ninguna información sobre esto.

¿STL:mapa simplemente no permitir esto?Puedo codificar mi aplicación para trabajar alrededor de esto, pero va a ser muy ineficiente y me gustaría conseguir este trabajo.Hay otro tipo de puntero que puedo hacer para que un elemento de un mapa que podría utilizar?

Gracias por su tiempo.

¿Fue útil?

Solución

No puede hacer esto porque los iteradores std::map no son iteradores de acceso aleatorio, por lo que no son comparables con <.

En su lugar, puede usar punteros al value_type en el primer mapa como clave de mapa.

Otros consejos

Tienes que aprender a leer los mensajes de error.En particular, mira el mensaje que viene después de la prolija descripción donde el error que ocurrió:

/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 de los iteradores no son comparables con el operador menor que la que el mapa de usa por defecto.

Supongo que puede proporcionar una función de comparación que compara los pares señalado por el iterador, ya que los iteradores sí mismos no pueden ser comparadas fácilmente en una manera 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;

std::pair define operator<.También he utilizado dos tipos iterator, ya que podría ser posible que los tipos son diferentes (iterator y const_iterator)

map<Key, Value>

El map iterator como elemento clave en otro operator < no es posible porque Key espera que map iterator se defina por defecto en la clave. Si el <=> (en este caso <=>) no está definido, entonces debe pasar un functor como una función de predicado que proporciona la comparación de Key (iterador de mapa).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top