C++ 填充标准::向量<;双倍>;有一个固定的值

C++ 填充标准::向量<;双倍>;有一个固定的值,c++,arrays,vector,stdvector,c++03,C++,Arrays,Vector,Stdvector,C++03,我的代码必须在多个平台(Linux、Mac、Windows)和体系结构(32/64位)上运行,并带有多个编译器(GCC、MSVC、Intel)。在一段瓶颈代码中,我已经分配了一个大小大于0的std::vector x。用给定的常量值填充它的最佳方法是什么 我的第一种方法是循环: for(std::size_t i = 0; i < x.size(); ++i) x[i] = c; 有没有一种标准的方法可以非常有效地做到这一点?(我不能测试所有可能的配置,我需要一个标准的或良好的感觉从

我的代码必须在多个平台(Linux、Mac、Windows)和体系结构(32/64位)上运行,并带有多个编译器(GCC、MSVC、Intel)。在一段瓶颈代码中,我已经分配了一个大小大于0的
std::vector x
。用给定的常量值填充它的最佳方法是什么

我的第一种方法是循环:

for(std::size_t i = 0; i < x.size(); ++i)
  x[i] = c;
有没有一种标准的方法可以非常有效地做到这一点?(我不能测试所有可能的配置,我需要一个标准的或良好的感觉从经验的反应)

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

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

 std::fill(v.begin(), v.end(), c);

另一种方法是使用接受两个元素的向量,一个是大小(元素计数,因为在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 << ' ';
    }
}
#包括
#包括
int main(){
常数双c=123.45;
std::向量v(100,c);
对于(std::vector::const_迭代器it=v.begin();it!=v.end();+it){

标准::cout@眠りネロク: 我的向量已经分配。分配一个新的向量可能最快?如果你能使用C++11移动语义,这将是最快的。否则,std::fill就是解决方案。我相信如果你能够这样做,构造并提供一个值将是最快的方式。听起来很奇怪,仅仅初始化数组就会造成瓶颈。这将ld表示您执行的额外操作很少,即实际使用的元素很少。也许稀疏数据结构更适合。您能详细介绍一下此数组的使用情况吗?@Caduchon:如果这不是瓶颈,那么优化它将不会有什么回报。“它经常被调用”如果经常调用其他代价更高的操作,则是一个不充分的参数。请注意,这相当于
assign
解决方案。在这种情况下,我更喜欢专用函数(即在类
std::vector
本身中),理论上比使用更通用迭代器的函数更有效(即不是随机访问迭代器)。@Caduchon:请注意,
std::fill
是一个模板。可以对
std::vector::iterator
进行专门化(这需要一些技巧,但对于标准库实现来说并不是一个不寻常的数量)@Caduchon-注意,
vector::assign
还必须处理向量大小发生变化的情况。因此
std::fill
包含较少的代码->良好的感觉。向量已分配,无法移动赋值(C++11之前)我明确提到我不能使用C++11。@Caduchon我已经更新了答案以符合C++03标准。
 std::fill(v.begin(), v.end(), c);
#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 << ' ';
    }
}