2016-08-19 39 views
2

我有一個情況我有2個載體:C++矢量串接器以避免拷貝

vector<char> v1 = {1,3,4} 
vector<char> v2 = {4,5,6} 

這在現實中會變得非常大。

需要對這些載體是什麼,他們分別傳遞給函數與簽名:

template<class supports_[]_operator> 
double absolutely_awesome_function(const supports_[]_operator& v) 

然而,我還需要級聯的矢量被傳遞給這個函數。

v3= {1,3,4,4,5,6} 

,在該點它永遠不會再次使用。

現在,很明顯,有很多方法可以簡單地創建一個新對象並將其傳入,但正如我所說的向量很大,'absolutely_awesome_function'非常快,所以這顯然不理想。

我想過做一個對象,像這樣:

template<class T> 
class AmIAVector{ 
    AmIAVector(const T& vec_1, const T& vec_2) 

    auto operator [](int i) const {return 'an index into either vec1 or vec2'} 
} 

但是,有沒有更好的方法/沒有的東西已經存在此

+0

'模板':我會打我的同事做這樣的事情...... –

+5

也許'absolutely_awe some_function'應該像大多數標準算法那樣採用迭代器,那麼你可以提供合適的開始和結束迭代器。像'boost :: join'可能也不錯:http://stackoverflow.com/questions/981186/chain-iterator-for-c或http://stackoverflow.com/questions/6747987/writing-an- iterator-that-makes-several-containers-look-as-one – doctorlove

+0

@ torbjorn它只是爲了清晰起見 – user3684792

回答

3

有這幾種可能的解決方案。

由於absolutely_awesome_function明確需要一個向量卡住了。

隨着重新設計,它可能需要迭代器,因爲大多數stl算法都可以,那麼您可以提供合適的迭代器beginend

類似boost :: join的東西就可以工作。

boost::join(v1, v2) 

相關問題: stackoverflow.com/questions/981186/chain-iterator-for-c,或Writing an iterator that makes several containers look as one

+2

即使在這種情況下,OP也沒有被卡住。在迭代器對上提供包含'operator []'的包裝器是很簡單的。基本上是一個加入的範圍;我相信那些也在Boost中。 – Angew

2

range-v3允許:

const std::vector<int> v1{4, 8, 15}; 
const std::vector<int> v2{16, 23, 42}; 
const auto view = ranges::view::concat(v1, v2); 

for (const auto& e : view) { 
    std::cout << e << " "; 
} 
std::cout << std::endl; 
std::cout << view[5] << std::endl; 

Demo