用merge在C++中合并两个列表

Merging both lists in C++ with merge

本文关键字:两个 列表 合并 merge C++      更新时间:2023-10-16

我在合并两个向量时遇到了问题。它们很少工作,我得到一个合并的输出。90%的时间程序崩溃。我是C++和编程的新手。我正在用的这本书是C++游戏编程的开始。也使用Microsoft visual C++2008。

这是我的密码。

//high scores
//demonstartes algorithms
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
    vector<int>::const_iterator iter;
    cout << "creating a list  of scores.";
    vector <int> scores;
    scores.push_back(1500);
    scores.push_back(3500);
    scores.push_back(7500);

cout << "nHight scores:n";
for (iter = scores.begin(); iter != scores.end(); ++iter)
    cout << *iter << endl;
cout << "nRandomizing scores.";
srand(time(0));
random_shuffle(scores.begin(), scores.end());
cout << "nHighs scores:n";
for (iter = scores.begin(); iter != scores.end(); ++iter)
    cout << *iter << endl;
cout << "nCreating another list fo scores.";
vector<int> moreScores;
moreScores.push_back(2000);
moreScores.push_back(4000);
moreScores.push_back(8000);
cout << "nMore High Scores:n";
for (iter = moreScores.begin(); iter != moreScores.end(); ++iter)
    cout << *iter << endl;
cout << "nMerging both lists.";
vector<int> allScores(6); //need container big enough to hold results
// allScores = null; //I tried to add a null statement to this so that memory would be clear. It didn't help.
merge(scores.begin(),scores.end(),
    moreScores.begin(),moreScores.end(),
    allScores.begin());

cout << "nAll Hight Scores:n";
for (iter = allScores.begin(); iter != allScores.end(); ++iter)
    cout << *iter << endl;
return 0;
}

merge函数应该用于排序数组。问题是,当你用random_shuffle打乱你的数组时,你的数组很可能没有排序(概率为5/6,约为90%)。可能您捕获了一个调试断言,该断言检查输入是否已排序。

std::merge要求对范围进行排序。因此,您需要确保先对范围进行排序。

if (!std::is_sorted(scores.begin(), scores.end()))
  std::sort(scores.begin(), scores.end());
if (!std::is_sorted(moreScores.begin(), moreScores.end()))
  std::sort(moreScores.begin(), moreScores.end());
std::merge(scores.begin(),scores.end(),
           moreScores.begin(),moreScores.end(),
           allScores.begin());