246 votes

C ++ STL Vectors: Récupère l'itérateur à partir de l'index?

Donc, j'ai écrit un tas de code qui accède aux éléments dans un vecteur stl par index [], mais maintenant je dois copier juste un morceau du vecteur. On dirait que vector.insert(pos, first, last) est la fonction que je veux ... sauf que je n'ai que le premier et le dernier en ints. Y a-t-il une belle manière de pouvoir obtenir un itérateur à ces valeurs?

354voto

dirkgently Points 56879

Essaye ça:

 vector<Type>::iterator nth = v.begin() + index;
 

102voto

bayda Points 7454

façon mentionnée par @dirkgently ( v.begin() + index ) gentil et rapide pour les vecteurs

mais std::advance ( v.begin(), index ) plus générique et pour les itérateurs à accès aléatoire fonctionnent également à temps constant.

MODIFIER
différences d'utilisation:

 std::vector<>::iterator it = ( v.begin() + index );
 

ou

 std::vector<>::iterator it = v.begin();
std::advance( it, index );
 

ajouté après les notes @litb.

64voto

Viktor Sehr Points 5634

Aussi; auto it = std::next(v.begin(), index);

Mise à jour: nécessite un compilateur compatible C ++11x

10voto

TimW Points 5715

Ou vous pouvez utiliser std::advance

 vector<int>::iterator i = L.begin();
advance(i, 2);
 

-3voto

yves Baumes Points 4521

Actutally std::vector sont destinés à être utilisés comme C onglet en cas de besoin. (C++ standard demandes que pour les vecteurs de la mise en œuvre , autant que je sache - le remplacement de tableau dans Wikipédia) Par exemple, il est parfaitement légal de faire ce qui suit, selon moi:

int main()
{

void foo(const char *);

sdt::vector<char> vec;
vec.push_back('h');
vec.push_back('e');
vec.push_back('l');
vec.push_back('l');
vec.push_back('o');
vec.push_back('/0');

foo(&vec[0]);
}

Bien sûr, toto ne doit pas copier l'adresse passée en paramètre et le stocker dans un endroit, ou vous devez vous assurer dans votre programme pour ne jamais pousser un nouvel élément en vec, ou en demandant de modifier sa capacité. Ou de risque d'erreur de segmentation...

Donc dans votre exemple, elle conduit à

vector.insert(pos, &vec[first_index], &vec[last_index]);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X