70 votes

Existe-t-il un équivalent compact à Python range () en C ++ / STL

Comment puis-je faire l'équivalent de ce qui suit en utilisant C ++ / STL? Je veux remplir un std::vector avec une plage de valeurs [min, max).

 # Python
>>> x = range(0, 10)
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 

Je suppose que je pourrais utiliser std::generate_n et fournir un foncteur pour générer la séquence, mais je me demandais s'il y avait une manière plus succincte de le faire en utilisant STL?

76voto

chris Points 28950

En C ++11, il y a std::iota :

 std::vector<int> x(10);
std::iota(std::begin(x), std::end(x), 0); //0 is the starting number
 

24voto

Mankarse Points 22800

Il y a boost :: irange :

 std::vector<int> x;
boost::push_back(x, boost::irange(0, 10));
 

3voto

Leonid Volnitsky Points 3927

Il y a boost::irange , mais il ne fournit pas de virgule flottante, des étapes négatives et ne peut pas initialiser directement les conteneurs stl.

Il y a aussi numeric_range dans ma bibliothèque RO

En RO, pour initialiser un vecteur:

 vector<int> V=range(10);
 

Exemple de couper-coller à partir de la page du document ( scc - évaluateur d'extraits de code C ++):

 // [0,N)  open-ended range. Only range from 1-arg  range() is open-ended.
scc 'range(5)'
{0, 1, 2, 3, 4}

// [0,N]  closed range
scc 'range(1,5)'
{1, 2, 3, 4, 5}

// floating point 
scc 'range(1,5,0.5)'
{1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5}

// negative step
scc 'range(10,0,-1.5)'
{10, 8.5, 7, 5.5, 4, 2.5, 1}

// any arithmetic type
scc "range('a','z')"
a b c d e f g h i j k l m n o p q r s t u v w x y z

// no need for verbose iota. (vint - vector<int>)
scc 'vint V = range(5);   V' 
{0, 1, 2, 3, 4}

// is lazy
scc 'auto NR = range(1,999999999999999999l);  *find(NR.begin(), NR.end(), 5)'
5

//  Classic pipe. Alogorithms are from std:: 
scc 'vint{3,1,2,3} | sort | unique | reverse'
{3, 2, 1}

//  Assign 42 to 2..5
scc 'vint V=range(0,9);   range(V/2, V/5) = 42;  V'
{0, 1, 42, 42, 42, 5, 6, 7, 8, 9}

//  Find (brute force algorithm) maximum of  `cos(x)` in interval: `8 < x < 9`:
scc 'range(8, 9, 0.01) * cos  || max'
-0.1455

//  Integrate sin(x) from 0 to pi
scc 'auto d=0.001;  (range(0,pi,d) * sin || add) * d'
2

//  Total length of strings in vector of strings
scc 'vstr V{"aaa", "bb", "cccc"};  V * size ||  add'
9

//  Assign to c-string, then append `"XYZ"` and then remove `"bc"` substring :
scc 'char s[99];  range(s) = "abc";  (range(s) << "XYZ") - "bc"'
aXYZ


// Hide phone number:
scc "str S=\"John Q Public  (650)1234567\";  S|isdigit='X';  S"
John Q Public  (XXX)XXXXXXX
 

3voto

Pour ceux qui ne peuvent pas utiliser C ++11 ou les bibliothèques:

 vector<int> x(10,0); // 0 is the starting number, 10 is the range size
transform(x.begin(),x.end(),++x.begin(),bind2nd(plus<int>(),1)); // 1 is the increment
 

1voto

Ben Points 4733

Je ne connais pas de moyen de le faire comme en python mais une autre alternative est évidemment de le parcourir en boucle:

 for (int i = range1; i < range2; ++i) {
    x.push_back(i);
}
 

la réponse de chris est meilleure si vous avez c ++11

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