回答
你不能重載operator<
爲指針,但你不需要,因爲std :: sort可以接受任何比較函數(或函子)。
另一個問題是排序算法不能交換數組,因爲它們是不可分配的。但是,您可以將一個指針數組排序到二維數組中(原樣保留原始數組)。
#include <algorithm>
#include <cstring>
#include <cstdio>
bool compare_cstring(const char* a, const char* b)
{
return strcmp(a, b) < 0;
}
int main()
{
const int count = 5;
char strings[count][10] = { "One", "Two", "Three", "Four", "Five" };
char* sorted_view[count];
for (int i = 0; i != count; ++i) {
sorted_view[i] = strings[i];
}
std::sort(sorted_view, sorted_view + count, compare_cstring);
for (int i = 0; i != count; ++i) {
puts(sorted_view[i]);
}
}
無法編寫operator<
與char
陣列配合使用。
該代碼實際上看起來像C代碼可疑,而不是使用std::string
的C++。
沒有辦法編寫operator<
,它將與std::sort
一起使用,因爲沒有交換功能可以正常工作,除非您編寫該TOO。
使用std::string
將使這很瑣碎,否則你就必須編寫自己的operator<
(看看C函數strcmp
)和swap
功能。
編輯:請注意,交換std::string
s幾乎肯定會比在char
陣列中交換大量內存更快。
目標是使用STL中的'sort'函數,這是C中不可用的。由於迭代器的工作方式,這可能是不可能的。 'std :: string'提供了我想避免的不必要的開銷。在'struct'中包裝字符數組提供了一種使用'sort'函數重載'operator <'結構的方法。想知道是否有更多方法使用'sort'對字符數組進行排序。 – Leonid 2011-03-31 20:52:48
@Leonid你是否描述並顯示'std :: string'和你想象的一樣慢並且是你應用程序中的一個實際瓶頸?更簡單的程序(例如使用'string'等抽象類型)奇怪地傾向於執行更好,因爲您可以專注於高級算法而不是低級細節。 – 2011-03-31 20:56:26
在我的情況'std :: string'將不得不做動態內存分配,我想避免使用靜態字符數組。對於**這個問題的目的,我根本不好奇找到哪一個更快。我很想知道是否可以在字符數組上使用'sort'。 – Leonid 2011-03-31 20:59:01
假設你真的做需要排序的二維數組行明智的,這是一個有點困難,使std::sort()
爲你做這個,即使考慮工作比較器仿函數:那就需要某種形式的迭代器適配器。
但是,您可以輕鬆地使用其他就地排序算法,如選擇排序:
#include <iostream>
#include <algorithm>
#include <string>
template<int N>
bool char_array_less(const char(&l)[N], const char(&r)[N])
{
return std::char_traits<char>::compare(&l[0], &r[0], N) < 0;
// for a more general solution
// return std::lexicographical_compare(&l[0], &l[0]+N, &r[0], &r[0]+N);
}
template<int N>
void swap_char_arrays(char(*l)[N], char(*r)[N])
{
std::swap_ranges(&(*l)[0], &(*l)[0]+N, &(*r)[0]);
}
const int ROWS = 105;
const int COLS = 105;
int main()
{
char a[ROWS][COLS] = {"foo", "bar", "whatever" };
for(char(*i)[COLS] = a; i != a+ROWS; ++i)
swap_char_arrays(i,
std::min_element(i, a+ROWS, char_array_less<COLS>));
for(int i=0; i<ROWS; ++i)
std::cout << a[i] << '\n';
}
- 1. 運營商<<在C#
- 2. 運營商<<在派生類C++
- 3. 運營商和字符串MIPS
- 4. 運營商<<超載
- 5. 超載運營商<<
- 6. 虛擬<<運營商
- 7. 運營商=在C++中
- 8. C#? :運營商
- 9. C++使用,而不是運營商運營商INT()+
- 10. 即使我超載`運營商<<`
- 11. PHP使用字符串作爲運營商
- 12. 嘗試使用|創建字符串的值或運營商
- 13. 使用新的運營商在C++
- 14. 超負荷運營商<<在C++類中的
- 15. 全球運營商<<和成員運營商之間的共存<<
- 16. 使用「?」運營商
- 17. 使用運營商
- 18. 無效<運營商
- 19. 的std ::排序()不尋求全球運營商<()定義
- 20. C++和++運營商
- 21. 運營商'。' VS ' - >' 在C++
- 22. 運營商在C++重載
- 23. 運營商: 「布爾++」 在C#
- 24. 運營商的sizeof(c)中
- 25. Ternary?運營商VS傳統的if-else運營商在C#
- 26. C++?運營商,運營商繼續在for循環
- 27. C++:在模板類運營商友元函數<<
- 28. 短路`運營商<<`在C++輸出
- 29. C++鑄造運營商和傳統的C鑄造運營商
- 30. 排序ArrayList <HashMap <字符串,字符串>>使用值
這看起來像一個家庭作業問題可疑。 – Mihai 2011-03-31 20:38:55
爲什麼你會使用字符數組的stl排序?不使用std :: strings? – Tim 2011-03-31 20:39:31
什麼字符串。我沒有看到任何字符串(只是一個大(2-D)字符數組)。 – 2011-03-31 20:40:58