請考慮以下代碼。 它應該按字典順序排列整數向量,即 ,即首先按第一列,然後按第二列排序,依此類推。 在我的應用程序中,我只關心8列中的前6列 所以在前6列的值相等的情況下返回true。使用STL排序時的比較方法問題
它引起了問題(分段故障)。它正在爲1000個數據工作,它崩潰了1001. 示例代碼是玩具,但排序是相當複雜的程序的一部分。 經過長時間的調試,我發現這是造成麻煩的原因。 該程序嘗試使用一個(1,0,...,0)條目對所有零的數組進行排序。
請任何C++專家,你能告訴我原始(列出)程序有什麼問題嗎?
我在32位和32位Windows上編譯32位和64位Linux和Visual Studio。 它總是崩潰。在評論發生變化後,一切似乎都很好。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int COLS = 8;
bool compare (const vector<int>& r1, const vector<int>& r2)
{
for (int i = 0; i < COLS-2; i++)
if (r1[ i ] != r2[ i ])
return (r1[ i ] < r2[ i ]);
return true; //if true is replace by r1[ COLS-1 ] < r2[ COLS-1 ] then is OK
};
int main(int argc, char **argv)
{
int Na = 20;
vector< vector<int> > v(Na);
for (int r = 0; r < v.size(); r++)
v[r].resize(COLS, 0);
v[0][0] = 1;
cout << "Sorting\n";
sort(v.begin(), v.end(), compare);
cout << "Eof Sorting\n";
return 0;
}
代碼註釋已經說明了問題。排序需要比較少於,而不是平等。 – 2011-03-25 22:44:43
@波Persson:這不會導致內存訪問衝突,只是一個不合邏輯的結果。 – Puppy 2011-03-25 22:46:10
@DeadMG - 如果std :: sort無法找到一致的排序,它可能會出現橫行。雖然取決於實施。 – 2011-03-25 22:49:01