Estou tentando obter o índice de um elemento em um vetor de strings
, para usá-lo como um índice em outro vetor do int
tipo, isso é possível?
Exemplo:
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);
}
Agora eu quero obter a posição de old_name
no Names
vetor, para usá-la no acesso a determinado elemento no Numbers
vetor. Para que eu possa dizer:
Numbers[position] = 3 ; // or whatever value assigned here.
Tentei usar:
vector <string> :: const_iterator pos;
pos = (find(Names.begin(), Names.end(), old_name_))
Numbers[pos] = 3;
mas obviamente isso não funciona, pois pos
é do tipo string!
Respostas:
Para obter a posição de um elemento em um vetor conhecendo um iterador apontando para o elemento, basta subtrair
v.begin()
do iterador:Agora é preciso verificar
pos
contraNames.size()
para ver se ele está fora dos limites ou não:iteradores de vetor se comportam de maneira semelhante a ponteiros de array; muito do que você sabe sobre aritmética de ponteiro também pode ser aplicado a iteradores vetoriais.
A partir do C ++ 11, você pode usar
std::distance
no lugar da subtração para iteradores e ponteiros:fonte
ptrdiff_t
é melhor do quesize_t
jáptrdiff_t
que levantaria um aviso de comparação entre inteiros assinados e não assinadosptrdiff_t
porque permite armazenar a distância entre qualquer par de iteradores no mesmo contêiner, mesmo em situações em que o resultado é negativo. Se usarmossize_t
, devemos ter cuidado para não subtrair um iterador maior de um iterador menor.Se você deseja um índice, pode usá-lo
std::find
em combinação comstd::distance
.fonte
Eu sou um iniciante, então aqui está uma resposta para iniciantes. O if no loop for fornece i que pode então ser usado no entanto necessário, como Números [i] em outro vetor. A maioria é fofura, por exemplo, o for / if realmente diz tudo.
fonte