web-dev-qa-db-fra.com

Créer un nouveau sous-vecteur C ++?

Disons que j'ai un vecteur avec des valeurs [1,2,3,4,5,6,7,8,9,10]. Je veux créer un nouveau vecteur qui fait référence, par exemple, à [5,6,7,8]. J'imagine qu'il s'agit simplement de créer un vecteur avec des pointeurs ou dois-je repousser toutes les valeurs intermédiaires dont j'ai besoin?

22
John Smith

Un des std::vector le constructeur accepte une plage:

std::vector<int> v;

// Populate v.
for (int i = 1; i <= 10; i++) v.Push_back(i);   

// Construct v1 from subrange in v.
std::vector<int> v1(v.begin() + 4, v.end() - 2);
43
hmjd

Vous n'êtes pas obligé d'utiliser Push_back si vous ne le souhaitez pas, vous pouvez utiliser std::copy:

std::vector<int> subvector;
copy ( v1.begin() + 4, v1.begin() + 8, std::back_inserter(subvector) );
4
Luchian Grigore

C'est assez facile à faire avec std::valarray au lieu d'un vecteur:

#include <valarray>
#include <iostream>
#include <iterator>
#include <algorithm>

int main() {
  const std::valarray<int> arr={0,1,2,3,4,5,6,7,8,9,10};

  const std::valarray<int>& slice = arr[std::slice(5, // start pos
                                                   4, // size
                                                   1  // stride
                                                  )];

}

Ce qui prend une "tranche" du valarray, plus génériquement qu'un vecteur.

Pour un vecteur, vous pouvez le faire avec le constructeur qui prend deux itérateurs cependant:

const std::vector<int> arr={0,1,2,3,4,5,6,7,8,9,10};
std::vector<int> slice(arr.begin()+5, arr.begin()+9);
4
Flexo

Je ferais ce qui suit:

#include <vector>
#include <iostream>

using namespace std;

void printvec(vector<int>& v){
        for(int i = 0;i < v.size();i++){
                cout << v[i] << " ";
        }
        cout << endl;
}

int main(){
        vector<int> v;

        for(int i = 1;i <= 10;i++) v.Push_back(i);
        printvec(v);

        vector<int> v2(v.begin()+4, v.end()-2);
        printvec(v2);
        return 0;
}

~

3
Taylor Southwick