从顺序值中快速创建矢量

时间:2013-09-04 23:08:11

标签: c++

如何从顺序值中快速创建矢量

例如:

vector<int> vec (4, 100);
for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
    cout << *it << endl;
}

输出:

# 100
# 100
# 100
# 100

我想要

vector<int> vec (100, "0 to N");

我想知道实现此结果的最有效方法。例如,不使用循环。

N是运行时变量。

6 个答案:

答案 0 :(得分:22)

这是另一种方式......

int start = 27;
std::vector<int> v(100);
std::iota(v.begin(), v.end(), start);

答案 1 :(得分:16)

这是一个不使用可见循环且只使用标准C ++库的版本。它很好地演示了使用lambda作为生成器。 reserve()的使用是可选的,只是为了避免多个内存分配。

std::vector<int> v;
v.reserve(100);
int n(0);
std::generate_n(std::back_inserter(v), 100, [n]()mutable { return n++; });

答案 2 :(得分:1)

你想要这样的东西:

std::vector<unsigned int> second(
    boost::counting_iterator<unsigned int>(0U),
    boost::counting_iterator<unsigned int>(99U));

答案 3 :(得分:1)

使用生成算法:

#include <iostream>     // std::cout
#include <algorithm>    // std::generate
#include <vector>       // std::vector
#include <iterator>

// function generator:
struct one_more { 
  int _count;
  one_more() : _count(0) {}
  int operator()() {
      return _count++;
  }
};

int main () {
  std::vector<int> myvector (100);
  std::generate (myvector.begin(), myvector.end(), one_more());

  std::copy(myvector.begin(), myvector.end(), std::ostream_iterator<int>(std::cout, " "));
  return 0;
}

答案 4 :(得分:0)

const int num_seconds = 100;
vector<int> second( num_seconds );
for( int n = 0 ; n < num_seconds ; ++n ) {
    second[ n ] = n;
}

答案 5 :(得分:0)

我知道这是一个老问题,但我现在正在玩library来处理这个问题。它需要c ++ 14。

#include "htl.hpp"

htl::Token _;

std::vector<int> vec = _[0, _, 100];
// or
for (auto const e: _[0, _, 100]) { ... }