Estoy tratando de obtener el índice de un elemento en un vector de strings
, para usarlo como índice en otro vector de int
tipo, ¿es posible?
Ejemplo:
vector <string> Names;
vector <int> Numbers;
...
// condition to check whether the name exists or not
if((find(Names.begin(), Names.end(), old_name_)) != Names.end())
{ // if yes
cout <<"Enter the new name."<< endl;
cin >> name;
replace(Names.begin(), Names.end(), old_name_, name);
}
Ahora quiero obtener la posición de old_name
en el Names
vector, para usarlo para acceder a cierto elemento en el Numbers
vector. Para que pueda decir:
Numbers[position] = 3 ; // or whatever value assigned here.
Intenté usar:
vector <string> :: const_iterator pos;
pos = (find(Names.begin(), Names.end(), old_name_))
Numbers[pos] = 3;
pero obviamente esto no funciona ya que pos
es de tipo cadena.
Respuestas:
Para obtener una posición de un elemento en un vector conociendo un iterador que apunta al elemento, simplemente reste
v.begin()
del iterador:Ahora es necesario comprobar
pos
en contraNames.size()
para ver si está fuera de límites o no:los iteradores vectoriales se comportan de manera similar a los punteros de matriz; la mayor parte de lo que sabe sobre aritmética de punteros también se puede aplicar a iteradores vectoriales.
A partir de C ++ 11, puede usar
std::distance
en lugar de la resta tanto para iteradores como para punteros:fuente
ptrdiff_t
es mejor quesize_t
desde queptrdiff_t
generaría una advertencia de comparación entre entero con y sin signoptrdiff_t
porque le permite almacenar la distancia entre cualquier par de iteradores en el mismo contenedor, incluso en situaciones en las que el resultado es negativo. Si usamossize_t
debemos tener cuidado de no restar un iterador más grande de un iterador más pequeño.Si desea un índice, puede usarlo
std::find
en combinación constd::distance
.fuente
Soy un principiante, así que aquí hay una respuesta para principiantes. El if en el bucle for da i que luego se puede usar sin embargo, como sea necesario, como Números [i] en otro vector. La mayoría es pelusa, por ejemplo, el por / si realmente lo dice todo.
fuente