Le découpage d'un vecteur
J'ai un std::vector. Je veux créer des itérateurs représentant une tranche de ce vecteur. Comment dois-je faire? En pseudo C++:
class InterestingType;
void doSomething(slice& s) {
for (slice::iterator i = s.begin(); i != s.end(); ++i) {
std::cout << *i << endl;
}
}
int main() {
std::vector v();
for (int i= 0; i < 10; ++i) { v.push_back(i); }
slice slice1 = slice(v, 1, 5);
slice slice2 = slice(v, 2, 4);
doSomething(slice1);
doSomething(slice2);
return 0;
}
Je préférerais ne pas avoir à copier les éléments d'un nouveau discbased.
- Pourquoi est-ce le wiki de la communauté?
- C'est une bonne question, Tom.
- En général, il est appelé une "tranche" quand vous avez besoin à la fois d'une gamme, et une foulée pas égal à un. Voir, par exemple std::gslice et std::valarray. Avec une foulée de l'un, il serait généralement être appelé une "gamme".
Vous devez vous connecter pour publier un commentaire.
Vous venais d'utiliser une paire d'itérateurs:
Sinon, le coup de pouce.Plage de la bibliothèque devrait vous permettre de vous représenter itérateur paires comme un objet unique, mais ce qui précède est la manière canonique de le faire.
J'ai appris le Python avant que j'ai appris le C++. Je me demandais si C++ offert découpage des vecteurs comme le découpage en Python listes. A fallu que quelques minutes pour écrire cette fonction vous permet de couper un vecteur analogue à la manière dont c'est fait en Python.
Utilisation:
La start_index élément sera inclus dans la tranche, alors que la end_index ne sera pas inclus.
Exemple:
Pour un vecteur v1 comme {1,3,5,7,9}
tranche(v1,2,4) renvoie {5,7}
Prises de ici:
Exemple d'utilisation:
Sorties:
Vous pouvez représenter ces "tranches" avec une paire d'itérateurs.
Comme d'autres l'ont dit, vous pouvez représenter la "tranche" en tant que paire d'itérateurs. Si vous êtes prêt à utiliser Boost, vous pouvez utiliser la gamme concept. Ensuite, vous aurez même begin()/fin() les fonctions de membres disponibles et le tout ressemble beaucoup à un conteneur.
utiliser boost gamme d'adaptateurs. ils sont paresseux:
doSomething
doit prendre de la gamme d'entrée. un simple (peut-être lambda) wrapper permettrait de résoudre ce problème.