es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo comparar dos iteradores de mapa en c++?

#include <iostream>
#include<vector>
#include<map>
using namespace std;
int main() {
vector<int> v1{1,2,3,4,5};
auto it1 = v1.begin();
auto it2 = v1.end();
if(it1<it2){
cout<<"VERDADERO"<<endl; // Salida: VERDADERO
}

map&lt;int,int&gt; m;
m.insert(make_pair(1,2));
m.insert(make_pair(5,7));
auto it3 = m.begin();
auto it4 = m.end();
if(it3!=it4){
    cout&lt;&lt;&quot;VERDADERO&quot;&lt;&lt;endl;           
}   
/*
error: no se encuentra coincidencia para el operador "operator<" (los tipos de operandos son "std::_Rb_tree_iterator<><const int,="" int="">>" y "std::_Rb_tree_iterator<><const int,="" int="">>")

18 | if(it3<it4){
| ~~~^~~~
*/

}

La línea (it1<it2) funciona bien cuando se usa un vector, pero (it3<it4) no funciona correctamente cuando se usa un mapa. ¿Qué concepto explica esto?

En el caso del vector, se puede ordenar fácilmente en una secuencia lineal de memoria accesible mediante iteradores. Los iteradores de vector son simplemente punteros a las posiciones de memoria donde se almacenan los elementos. Por lo tanto, se pueden comparar directamente con el operador <.

Por otro lado, los elementos en un mapa no están almacenados en una secuencia lineal de memoria, sino que se almacenan en un árbol binario basado en el valor de sus claves. La comparación de los iteradores de mapa se realiza mediante la comparación de las claves de los elementos a los que se refieren. Por lo tanto, el operador < no está sobrecargado para los iteradores de mapa y no se puede usar directamente para compararlos. En su lugar, debe usar la comparación de valores, como it3!=it4 para verificar si los iteradores son desiguales.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual (it1<it2) funciona=”” bien=”” al=”” usar=”” un=”” vector=”” pero=””></it2)><it4) no=”” funciona=”” al=”” usar=”” un=”” mapa=”” se=”” debe=”” al=”” hecho=”” de=”” que=”” los=”” iteradores=”” de=”” vector=”” y=”” mapa=”” son=”” diferentes.=”” los=”” iteradores=”” de=”” vector=”” son=”” iteradores=”” bidireccionales,=”” lo=”” que=”” significa=”” que=”” se=”” puede=”” usar=”” el=”” operador=”” menor=”” que=”” para=”” compararlos.=”” sin=”” embargo,=”” los=”” iteradores=”” de=”” mapa=”” son=”” en=”” realidad=”” iteradores=”” de=”” árbol=”” rojo-negro=”” que=”” no=”” tienen=”” el=”” operador=”” menor=”” que=”” definido=”” para=”” ellos.=”” en=”” su=”” lugar,=”” se=”” puede=”” usar=”” la=”” función=”” map::key_comp=”” que=”” devuelve=”” un=”” objeto=”” de=”” función=”” de=”” comparación=”” que=”” se=”” puede=”” utilizar=”” para=”” comparar=”” claves.=”” alternativamente,=”” se=”” puede=”” usar=”” la=”” función=”” std::distance=”” para=”” calcular=”” la=”” distancia=”” entre=”” los=”” dos=”” iteradores=”” de=”” esta=”” manera:=”” if(std::distance(it3,it4)=””> 0){
    cout<<“TRUE”<<endl;
    }

    esto mostrará “true” si la distancia entre los iteradores es mayor que 0, lo que indica que it3 está antes de it4 en el mapa. }=”” esto=”” mostrará=”” “true”=”” si=”” la=”” distancia=”” entre=”” los=”” iteradores=”” es=”” mayor=”” que=”” 0,=”” lo=”” que=”” indica=”” que=”” it3=”” está=”” antes=”” de=”” it4=”” en=”” el=””></endl;
    }

    esto mostrará “true” si la distancia entre los iteradores es mayor que 0, lo que indica que it3 está antes de it4 en el mapa.></it4)>

Comments are closed.