0

目前我有以下代码将一些双打复制到不同的双打向量。

for (int i = 0;i<=iTo;i++)
{

    int iID= i + iOff;
    double d=m[iID];
    uTargets[iSamplePos]=d;
    iSamplePos++;
}

有人可以告诉我没有“手动”迭代的最快方法吗?

谢谢!

4

3 回答 3

4

如果您要覆盖现有向量:

uTargets.assign(m.begin() + iOff, m.begin() + iOff + iTo + 1);

如果您要复制到已经存在的范围:

std::copy(m.begin() + iOff, m.begin() + iOff + iTo + 1, uTargets.begin() + iSamplePos);
于 2013-06-14T17:18:33.053 回答
1

请查看 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 
于 2013-06-14T19:12:52.333 回答
1

您可以使用 memcpy(uTargets,m+iOFF,(iTo-iOff+1)*sizeof(double)); 但我会坚持使用更可靠的方法,例如迭代或 std::copy,除非您需要复制大量内存。

于 2013-06-14T17:33:37.083 回答