目前我有以下代码将一些双打复制到不同的双打向量。
for (int i = 0;i<=iTo;i++)
{
int iID= i + iOff;
double d=m[iID];
uTargets[iSamplePos]=d;
iSamplePos++;
}
有人可以告诉我没有“手动”迭代的最快方法吗?
谢谢!
目前我有以下代码将一些双打复制到不同的双打向量。
for (int i = 0;i<=iTo;i++)
{
int iID= i + iOff;
double d=m[iID];
uTargets[iSamplePos]=d;
iSamplePos++;
}
有人可以告诉我没有“手动”迭代的最快方法吗?
谢谢!
如果您要覆盖现有向量:
uTargets.assign(m.begin() + iOff, m.begin() + iOff + iTo + 1);
如果您要复制到已经存在的范围:
std::copy(m.begin() + iOff, m.begin() + iOff + iTo + 1, uTargets.begin() + iSamplePos);
请查看 C++ 标准库的算法部分的文档。
算法库为各种目的(例如搜索、排序、计数、操作)定义了对元素范围进行操作的函数。请注意,范围定义为 [first, last),其中 last 指的是经过最后一个要检查或修改的元素之后的元素。
一般来说,对于以不同方式遍历容器和对其元素应用某种类型的转换等操作,您应该依赖标准接口。
在您的特定情况下,您提到您有两个向量(我假设您的意思是 class 的对象std::vector<T>
)。
正如其他人提到的,您可以使用 algorithm std::copy
,它采用以下语法:
std::copy(source.begin(), source.end(), destination.begin())
现在,你必须在这里小心。这假定destination
已经预留了空间。也就是说,在该行之前的某个位置,您将目标创建为:
std::vector<double> destination(source.size());
如果不是这种情况,您可以使用一种称为“后插入器”的迭代器。
下面的例子可以说明一些问题(注意,它std::iota
只是用序列填充容器(例如,k、k++、k++、...))
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
void show(const char* name, std::vector<double>& v) {
std::cout<<"Vector '"<<name<<"'"<<std::endl;
for(auto & item : v) {
std::cout<<item<<" ";
}
std::cout<<std::endl;
}
int main() {
// create a vector to store twenty doubles
std::vector<double> source(20);
// fill with the numbers 0, 1, ..., 19
std::iota(source.begin(), source.end(), 0);
// let's peek
show("Source", source);
// create a destination vector capable of holding the values
std::vector<double> destination_1(source.size());
// copy the values
std::copy(source.begin(), source.end(), destination_1.begin());
show("Destination 1", destination_1);
// create a destination vector without space reserved
std::vector<double> destination_2;
// copy the values (use the back inserter)
std::copy(source.begin(), source.end(), std::back_inserter(destination_2));
show("Destination 2", destination_2);
return 0;
}
输出(使用 C++11 支持使用 g++ 4.7.2 编译,即c++ file.cpp -std=c++11
):
Vector 'Source'
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Vector 'Destination 1'
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Vector 'Destination 2'
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
您可以使用 memcpy(uTargets,m+iOFF,(iTo-iOff+1)*sizeof(double)); 但我会坚持使用更可靠的方法,例如迭代或 std::copy,除非您需要复制大量内存。