2013-04-01 60 views
1

我使用另一个将任何STL顺序容器作为参数的函数库中的函数。只是为了争辩,我会保留它作为std::vectorC++:从向量作为参数的子向量作为函数的参数

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

我有数据的一整个vector(恰好是double类型)有一种方法来传递的子载体优选通过参照与无手之前复制和分裂矢量,该功能?这是直接通过复制(通过简单地复制子向量,返回vector功能,并将各自的子向量回到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--]); 

任何帮助表示赞赏,即使它是不可能的,如果你知道一种方法来来回拷贝效率

注:如果它的任何帮助,因此程序员,我的载体将是相同的大小与相同的预定位子矢量不等于myVector.begin()myVector.back()。此外,这将永远不会改变那一个载体

+4

使用迭代器,或者如果你想稍微好些的语法,可以使用类似[boost :: adapters :: sliced](http://www.boost.org/doc/libs/1_53_0/libs/range/doc/html /range/reference/adaptors/reference/sliced.html)。 – Mankarse

回答

2

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

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

根据什么在你调用这个函数模板,你可能能够通过切片的范围内发生的顺序,因为在升压规定的具体范围确实有begin()end()成员函数。但是由于它对容器采用了非const引用,因此它有可能会添加或删除元素,在这种情况下,您运气不佳。