在没有std :: merge的情况下合并两个stl容器

时间:2013-12-06 15:38:14

标签: c++ list vector merge containers

我必须编写一个合并函数,在不使用std :: merge的情况下合并两个stl容器。我想使用std :: merge的实现。

template <typename InputIterator1, typename InputIterator2, typename OutputIterator>
OutputIterator merge (InputIterator1 first1, InputIterator1 last1, 
                      InputIterator2 first2, InputIterator2 last2, 
                      OutputIterator result) {
    while (true) {      
        if (first1==last1) 
            return std::copy(first2,last2,result);

        if (first2==last2) 
            return std::copy(first1,last1,result);

        *result++ = (*first2<*first1)? *first2++ : *first1++;
    }
}

我想用它来测试它:

    std::vector<int> v1;
v1.push_back(1);
v1.push_back(7);

std::list<int> l1;
l1.push_back(23);
l1.push_back(3);

std::vector<int> v2;
std::vector<int>::iterator first1 = v1.begin(), last1 = v1.end(), output = v2.end();
std::list<int>::iterator first2 = l1.begin(), last2 = l1.end();

merge<std::vector<int>::iterator, std::list<int>::iterator, std::vector<int>::iterator>(first1, last1, first2, last2, output);

为什么会产生运行时错误,说“矢量迭代器不可递增”?

编辑:感谢您的答案,合并工作但输出未排序

3 个答案:

答案 0 :(得分:2)

您需要为v2分配内存,以使输出结果迭代器可以解除引用。

std::vector<int> v2( v1.size() + l1.size() );

output = v2.begin();

答案 1 :(得分:1)

你正试着写v2.end()以及之后。这不会增长v2,它只会践踏无效内存,从而产生未定义的行为。

要使v2大到足以写入:

std::vector<int> v2(v1.size() + l1.size());
auto output = v2.begin();

或使用插入迭代器

std::vector<int> v2;
auto output = std::back_inserter(v2);

顺便说一下,调用merge时不需要指定模板参数;它们可以从函数参数中推断出来:

merge(first1, last1, first2, last2, output);

答案 2 :(得分:0)

您的代码可以通过以下方式重写

std::vector<int> v1;
v1.reserve( 2 );
v1.push_back(1);
v1.push_back(7);

std::list<int> l1;
l1.push_back(23);
l1.push_back(3);

std::vector<int> v2;
v2.reserve( v1.size() + l1.size() );

merge( v1.begin(), v1.end(), l1.begin(), l1.end(), std::back_inserter( v2 ) );