2013-04-01 58 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引用,因此它有可能會添加或刪除元素,在這種情況下,您運氣不佳。