C ++ STL: procure mapa iterador para outro mapa
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.
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).