c ++ vector concatenator避免复制

时间:2016-08-19 13:01:20

标签: c++ vector

我有一种情况,我有2个向量:

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}

此时它再也不会被使用了。

现在,很明显,有很多方法可以简单地创建一个新对象并将其传递出来,但正如我所说的那样,矢量很大并且“绝对_功能”功能很强大。非常快,所以这显然不太理想。

我想过制作一个这样的物体:

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'}
}

但是这个

是否有更好的方式/已经存在的东西

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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