如果您可以访问C ++ 11,则可以使用 std::generate 与lambda:
std::generate
std::generate(v.begin(), v.end(), [n = 0, &a] () mutable { return a * n++; });
但是,对于这个用例,如评论中所述,几乎不需要矢量。
如果你正在寻找像matlab linspace这样的东西,它在C ++中不是直接可用的,但是编写一个函数很容易。喜欢:
std::vector<float> linspace(float start, float end, size_t points) { std::vector<float> res(points); float step = (end - start) / (points - 1); size_t i = 0; for (auto& e : res) { e = start + step * i++; } return res; }
然后你就可以使用它:
int main() { std::vector<float> v = linspace(1, 5, 6); for (auto f : v) std::cout << f << " "; std::cout << std::endl; return 0; }
输出:
1 1.8 2.6 3.4 4.2 5
您可以定义具有的类型 operator++ 并转换为 float ,并使用 std::iota
operator++
float
std::iota
#include <algorithm> #include <vector> struct spacer { spacer(float scale, int count = 0) : scale(scale), count(count) {} spacer operator++(){ ++count; return *this; } operator float(){ return count * scale; } private: float scale; int count; }; int main() { std::vector<float> v(100); std::iota(v.begin(), v.end(), spacer(1.132)); }
如果您有权访问 boost ,你可以使用和实例化你的矢量 boost::counting_iterator
boost
boost::counting_iterator
#include <algorithm> #include <vector> #include <tuple> #include <boost/iterator/counting_iterator.hpp> struct spacer { spacer(float scale, int count = 0) : scale(scale), count(count) {} spacer operator++(){ ++count; return *this; } operator float() const{ return count * scale; } bool operator==(const spacer & rhs) const{ return std::tie(count, scale) == std::tie(rhs.count, rhs.scale); } private: float scale; int count; }; int main() { using iter = boost::counting_iterator<spacer, std::forward_iterator_tag, std::ptrdiff_t>; std::vector<float> v(iter(spacer(1.132)), iter(spacer(1.132, 100))); }