使用常量值填充std :: vector <double>

Cad*_*hon 2 c++ arrays vector stdvector c++03

我的代码必须在几个平台(Linux,Mac,Windows)和架构(32/64位)上运行,并有几个编译器(GCC,MSVC,Intel).在瓶颈代码中,我已经分配std::vector<double> x了大小> 0.用给定的常量值填充它的最佳方法是什么c

我的第一种方法是循环:

for(std::size_t i = 0; i < x.size(); ++i)
  x[i] = c;
Run Code Online (Sandbox Code Playgroud)

循环也可以用迭代器完成:

for(std::vector<double>::iterator it = x.begin(); it != x.end(); ++it)
  *it = c;
Run Code Online (Sandbox Code Playgroud)

我也可以使用类提供的赋值函数,std::vector并且如果大小相同,我可以确信没有重新分配(我希望):

x.assign(x.size(), c);
Run Code Online (Sandbox Code Playgroud)

有没有一种标准的方法来非常有效地做到这一点?(我无法测试所有可能的配置,我需要标准或良好的体验感受响应).

注1:我不想使用asm的解决方案

注2:出于兼容性原因,我不使用C++ 11

Iva*_*ets 13

您可以使用std::fill填充整个矢量

 std::fill(v.begin(), v.end(), c);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这相当于`assign`解决方案. (4认同)
  • @Caduchon:注意`std :: fill`是一个模板.`std :: vector :: iterator`可以有一个特殊化(需要一些技巧,但标准库实现不是一个不寻常的数量). (3认同)

Ron*_*Ron 5

另一种方法是使用vector的构造函数重载,它接受两个元素,一个是size(元素数,因为在C++ 11之前的编译器上),另一个是填充它的元素:

#include <iostream>
#include <vector>
int main(){
    const double c = 123.45;
    std::vector<double> v(100, c);
    for (std::vector<double>::const_iterator it = v.begin(); it != v.end(); ++it){
        std::cout << *it << ' ';
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Caduchon我已经更新了符合C++ 03标准的答案. (2认同)