<p>I know how to fill an std::vector with non-trivial initial values, e.g. sequence numbers:</p>

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

<p>But this is a for-loop. Is there an elegant way to do this with less lines of code using stl functionality (and <strong>not</strong> using Boost)?</p>

You can use the generate algorithm, for a more general way of filling up containers:
```
```
#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;
}
```
```
This was shamelessly lifted and edited from
cplusplusreference
.