1. 程式人生 > >兩種字串比較方法

兩種字串比較方法

c++中在將字串做為map的key時,或對字串進行排序時,需要提供比較方法,如果使用的是string,可以不用指定比較方法,因為標準庫為basic_string定義了bool operator< (const string& lhs, const string& rhs);,最終呼叫的是strcmp方法,然而有時候我們可能需要不一樣的排序方式。下面提供了兩種比較方法,compare_left和strcmp的比較方式是一樣的,可以理解為將所有的字串左對齊然後進行比較,compare_right則是先比較字串長度,可以理解為將所有的字串右對齊然後進行比較。

#include <string>
#include <algorithm> #include <iostream> #include <iterator> #include <string.h> #include <stdio.h> int compare_left(void *p1, size_t s1, void *p2, size_t s2) { if(int cmp = memcmp(p1, p2, std::min(s1, s2))) return cmp; return s1 - s2; } int compare_right(void *p1,
size_t s1, void *p2, size_t s2) { if(int cmp = s1 - s2) return cmp; return memcmp(p1, p2, s1); } bool cmp_int(int k1, int k2) { char buf1[12] = {0}; char buf2[12] = {0}; int s1 = sprintf(buf1, "%d", k1); int s2 = sprintf(buf2, "%d", k2); return compare_right(buf1, s1, buf2, s2) < 0; } int
main() { const int size = 100000; int t[size]; for(int i=0;i<size;++i) { t[i] = i+1; } std::random_shuffle(t, t+size); std::sort(t, t+size, cmp_int); std::ostream_iterator<int> out_it(std::cout, "\n"); std::copy(t, t+size, out_it); return 0; }