std::sort
用於對STL集合進行排序。如果可以簡單地比較要排序的集合中的元素通過調用operator<
和有問題的集合是一個vector
,然後排序很簡單:
std::sort(collection.begin(), collection.end());
如果有問題的收集不是vector
但list
在你的情況,那麼你可以不使用的std::sort
普通版,但你可以使用std::list
的版本而不是:
list<int> numbers;
numbers.sort();
STL的sort
,與STL中的大多數其他算法一起,有兩種形式。一個是我們已經看到的簡單版本,它只是使用operator<
來比較兩個元素。另一種是「預測」版本,而不是使用operator<
使用您提供的比較functor。這是你需要在你的情況下使用。list
有一個sort
的預測版本,這是你需要在你的情況下使用。
您可以通過多種方式創建一個函子,但最有效的方法之一就是從std::unary_function
或std::binary_function
派生類,這取決於你的仿函數將多少個參數需要 - 在你的情況下,兩個。重寫函數調用操作,operator()
並補充說,比較兩個元素的代碼:
class compare_functor : public std::binary_function<Move, Move, bool>
{
public:
bool operator(const Move& lhs, const Move& rhs) const
{
int left_val = lhs.Value();
int right_val = rhs.Value();
return left_val < right_val;
};
下面是一個完整的工作的例子,把一切融合在一起。在這個程序中,我沒有列出Move
s,而是列出了10 string
s。每個string
是6個隨機字符。該列表通過調用generate_n
來填充,該函數使用函子generator
來創建每個隨機字符串。然後,我通過調用copy
並傳遞將值轉儲到標準輸出的輸出迭代器(ostream_iterator
)來轉儲該字符串列表以及它們的值。每個字符串的值只是每個字符的數字值的總和,由函數strng_val
計算。
然後我使用list
的預測版本sort
對列表進行排序。 sort
使用的比較謂詞是evaluator
。然後,我最後將結果列表和字符串值再次轉儲到屏幕上,如上所示:
#include <cstdlib>
#include <iostream>
#include <list>
#include <string>
#include <algorithm>
#include <ctime>
#include <sstream>
using namespace std;
class generator
{
public:
generator() { srand((unsigned)time(0)); }
string operator()() const
{
string ret;
for(int i = 0; i < 6; ++i)
ret += static_cast<char>((rand()/(RAND_MAX/26)) + 'A');
return ret;
}
};
unsigned string_val(const string& rhs)
{
unsigned val = 0;
for(string::const_iterator it = rhs.begin(); it != rhs.end(); ++it)
val += (*it)-'A'+1;
return val;
};
class evaluator : public std::binary_function<string,string,bool>
{
public:
bool operator()(const string& lhs, const string& rhs) const
{
return string_val(lhs) < string_val(rhs);
}
};
class string_dumper : public std::unary_function<string, string>
{
public:
string operator()(const string& rhs) const
{
stringstream ss;
ss << rhs << " = " << string_val(rhs);
return ss.str();
}
};
int main()
{
// fill a list with strings of 6 random characters
list<string> strings;
generate_n(back_inserter(strings), 10, generator());
// dump it to the screen
cout << "Unsorted List:\n";
transform(strings.begin(), strings.end(), ostream_iterator<string>(cout, "\n"), string_dumper());
// sort the strings according to their numeric values computed by 'evaluator'
strings.sort(evaluator()); // because this is a 'list', we are using list's 'sort'
// dump it to the screen
cout << "\n\nSorted List:\n";
transform(strings.begin(), strings.end(), ostream_iterator<string>(cout, "\n"), string_dumper());
return 0;
}
+1,由於RandomAccess屬性,對矢量的排序更有效率。並且對memoization的關心確實是受歡迎:) – 2010-06-15 14:33:08
我會使用'std :: transform'而不是最後一個循環。 – pmr 2010-06-15 14:51:11
+1以提高效率。 – shuttle87 2010-06-16 00:28:25