2

我使用来自另一个库的函数,该函数将任何 STL 顺序容器作为参数。只是为了争论,我将其保留为std::vector.

do_something (std::vector<double>& k)
{
    ...
}

我有一个完整vector的数据(碰巧是类型double)有没有办法通过参考传递一个子向量,而不是事先复制拆分向量,到这个函数?它通过复制直接进行(通过简单地复制subvector,返回vectorfrom 函数并将相应的子向量放回vector)。为什么?:

  1. 我不想复制的原因完全是因为速度,我会多次调用这个函数(我的意思是很多次),性能是最重要的。
  2. 我不想事先拆分向量的原因是文件 IO 操作。顺序向量允许快速文件写入,特别是在二进制模式下

换句话说,我可以做这样的事情(在下面的伪代码示例中)吗?

std::vector<double> myVector{1.2, 5.6, 8.6, 2.2, 1.7, 9.1}; // myVeector of size 6

do_something (&myVector[ -- elementss 2,3,4--]);

任何帮助表示赞赏,即使不可能,并且如果您知道一种有效地来回复制的方法

注意:如果对 SO 程序员有任何帮助,我的向量将与相同的预定位子向量大小相同,不等于 frommyVector.begin()myVector.back()。对于那个向量,这也永远不会改变

4

1 回答 1

3

不,这做不到。这就是为什么标准算法接受两个(或更多)迭代器作为参数,而不是一个容器。

您还可以查看 Boost.Range 库,它允许包含切片的范围适配器。

根据您调用的此函数模板中的内容,您可能能够传递切片范围来代替序列,因为 Boost 中定义的具体范围确实具有begin()成员end()函数。但是由于它需要一个对容器的非常量引用,所以它有可能添加或删除元素,在这种情况下你就不走运了。

于 2013-04-01T05:04:45.043 回答