用常数值填充 std::vector<double>
Fill a std::vector<double> with a constant value
我的代码必须在多个平台(Linux、Mac、Windows)和具有多个编译器(GCC)的架构(32/64 位)上 运行 , MSVC, 英特尔)。在一段瓶颈代码中,我已经分配了一个大小 > 0 的 std::vector<double> x
。用给定的常量值 c
填充它的最佳方法是什么?
我的第一种方法是循环:
for(std::size_t i = 0; i < x.size(); ++i)
x[i] = c;
循环也可以用迭代器完成:
for(std::vector<double>::iterator it = x.begin(); it != x.end(); ++it)
*it = c;
我也可以使用 class std::vector
给出的赋值函数,并且相信如果大小相同就不会重新分配(我希望):
x.assign(x.size(), c);
有没有标准的方法可以非常有效地做到这一点? (我无法测试所有可能的配置,我需要一个标准的或 良好的体验 响应)。
注1:我不想要使用asm的解决方案
注2:出于兼容性原因我不使用C++11
你可以use std::fill
填充整个向量
std::fill(v.begin(), v.end(), c);
另一种方法是使用接受两个元素的向量 constructor overload,一个是大小(元素计数,因为在 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 << ' ';
}
}
我的代码必须在多个平台(Linux、Mac、Windows)和具有多个编译器(GCC)的架构(32/64 位)上 运行 , MSVC, 英特尔)。在一段瓶颈代码中,我已经分配了一个大小 > 0 的 std::vector<double> x
。用给定的常量值 c
填充它的最佳方法是什么?
我的第一种方法是循环:
for(std::size_t i = 0; i < x.size(); ++i)
x[i] = c;
循环也可以用迭代器完成:
for(std::vector<double>::iterator it = x.begin(); it != x.end(); ++it)
*it = c;
我也可以使用 class std::vector
给出的赋值函数,并且相信如果大小相同就不会重新分配(我希望):
x.assign(x.size(), c);
有没有标准的方法可以非常有效地做到这一点? (我无法测试所有可能的配置,我需要一个标准的或 良好的体验 响应)。
注1:我不想要使用asm的解决方案
注2:出于兼容性原因我不使用C++11
你可以use std::fill
填充整个向量
std::fill(v.begin(), v.end(), c);
另一种方法是使用接受两个元素的向量 constructor overload,一个是大小(元素计数,因为在 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 << ' ';
}
}