2013-07-30 70 views
0

我在合并两个向量时遇到了问题。他们很少工作,我得到了一个合并输出。 90%的时间程序崩溃。我不熟悉C++和编程。我正在使用的这本书正在开始C++游戏编程。还使用Microsoft visual C++ 2008.在C++中合并两个列表合并

这是我的代码。

//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; 

} 

回答

1

合并函数应该与排序的数组一起工作。问题在于当你使用random_shuffle对数组进行洗牌时,数组很可能未被排序(概率为5/6,大概为90%)。可能你会发现一个调试断言,它检查输入是否被排序。

1

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());