有两个向量:std::vector<int> collA{2,4,6,3,5,7}std::vector<int> collB(collA.size()),我试图将collA(包含偶数)的左半部分和collA(包含奇数)的右侧合并到collB中:

std::merge(collA.cbegin(), std::next(collA.cbegin(), collA.size()/2 + 1), // left source
    std::next(collA.cbegin(), collA.size()/2), collA.cend(),  // right source
    collB.begin()); // Output


但是,std::merge()在某处失败,Visual Studio 2012给我以下错误:

 ---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Assertion Failed!

Program: C:\Windows\system32\MSVCP110D.dll
File: c:\program files (x86)\microsoft visual studio 11.0\vc\include\algorithm
Line: 3102

Expression: sequence not ordered

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.


两个输入范围都已排序,所以为什么会出现此错误?
(注意:VS2012不支持C ++ 11初始化程序列表语法,我以前节省了一些空间)

最佳答案

两个输入范围均已排序


不,这不是真的。你可以用

std::vector<int> collA{2,4,6,3,5,7};

std::copy(collA.cbegin(), std::next(collA.cbegin(), collA.size()/2 + 1),
            std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::copy(std::next(collA.cbegin(), collA.size()/2), collA.cend(),
            std::ostream_iterator<int>(std::cout, " "));


输出:

2 4 6 3
3 5 7


您必须为第一个序列更改最后一个迭代器:

std::next(collA.cbegin(), collA.size()/2)
//                                     no + 1 here


因为collA的大小为6,并且collA.cbegin() + collA.size() / 2 + 1collA.cbegin() + 4相同,并且指向5

关于c++ - 使用STL std::merge()将 vector 的两个部分合并为另一个 vector ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19698567/

10-11 03:40