2008-10-16 25 views
14

Sé cómo llenar un std :: vector con valores iniciales no triviales, p. números de secuencia:¿Cómo llenar un vector con valores iniciales no triviales?

void IndexArray(unsigned int length, std::vector<unsigned int>& v) 
{ 
    v.resize(length); 
    for (unsigned int i = 0; i < length; ++i) 
    { 
     v[i] = i; 
    } 
} 

Pero esto es un bucle. ¿Hay una manera elegante de hacer esto con menos líneas de código usando la funcionalidad stl (y no usando Boost)?

Respuesta

15

Se puede utilizar el algoritmo de generar, para una manera más general de llenar recipientes:

#include <iostream> 
#include <algorithm> 
#include <vector> 

struct c_unique { 
    int current; 
    c_unique() {current=0;} 
    int operator()() {return ++current;} 
} UniqueNumber; 


int main() { 
    vector<int> myvector (8); 
    generate (myvector.begin(), myvector.end(), UniqueNumber); 

    cout << "\nmyvector contains:"; 
    for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it) 
    cout << " " << *it; 

    cout << endl; 

    return 0; 
} 

Este se levantó y editado de cplusplusreference sin vergüenza.

+0

Es posible que desee comenzar con v [i] == i, pero cámbielo más tarde en el código. – paxdiablo

+0

sí, probablemente, esperaba que él explicara el caso. posiblemente haya un mejor método que llenarlos primero. Como una forma de evaluación perezosa o algo así. – moogs

+0

Hice mi pregunta más general, ya que la pregunta era sobre inicialización con valores no triviales. De hecho, quería llenar la matriz con números de índice, para poder permutarlos más tarde. Probablemente haya otras soluciones para eso también. –

4

Si está utilizando SGI STL (o un derivado, como STLPort), puede usar iota. :-)

void IndexArray(unsigned int length, vector<unsigned int>& v) 
{ 
    vector<unsigned int>(length).swap(v); 
    iota(v.begin(), v.end(), 0); 
} 
+1

También presente en C++ 11 – DarioP

5

suelo ir con std::generate más un simple generador:

template <typename T> 
struct gen { 
    T x; 
    gen(T seed) : x(seed) { } 

    T operator()() { return x++; } 
}; 

generate(a.begin(), a.end(), gen<int>(0)); 
2

También hay una función iota() en adobe.ASL, (y una value_iterator también). En boost, hay un counting_iterator, y sospecho que algunas otras maneras de generar secuencias de números sobre la marcha en boost.

0

Si tiene una matriz estilo de C puede utilizar std: copiar, por ejemplo,

int c_array[] = {3,4,5}; 

const int* pbegin = &c_array[0]; 
const size_t c_array_size = sizeof(c_array)/sizeof(c_array[0]); 
const int* pend = pbegin + c_array_size; 

std::vector<int> v; 
v.reserve(c_array_size); 
std::copy(pbegin, pend, std:back_inserter(v)); 
1

Sé que esto ya ha sido contestada, pero me quedo con la función de "relleno" en la biblioteca de algoritmos, ya que es parece más intuitivo para mí leer:

// fill algorithm example 
#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 

int main() { 
    vector<int> myvector (8);      // myvector: 0 0 0 0 0 0 0 0 

    fill (myvector.begin(),myvector.begin()+4,5); // myvector: 5 5 5 5 0 0 0 0 
    fill (myvector.begin()+3,myvector.end()-2,8); // myvector: 5 5 5 8 8 8 0 0 

    cout << "myvector contains:"; 
    for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it) 
    cout << " " << *it; 

    cout << endl; 

    return 0; 
} 

Esto también también fue levantado sin pudor de cplusplusreference.

+0

¿Cómo usarías esto para llenar un vector con números progresivos como se lo pidieron? – DarioP

Cuestiones relacionadas