回答
你不能重載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. 字符串和? :運營商
- 3. 運營商<<重載在C++中
- 4. 運營商<<在派生類C++
- 5. 在C#中處理空字符串?運營商
- 6. 運營商<<重載 - C++和Java
- 7. 錯誤不符合運營商<<
- 8. '&&'和'||'帶字符串的運營商
- 9. 運營商和字符串MIPS
- 10. MongoDB $ gt/$ lt運營商與價格存儲爲字符串
- 11. 運營商<<超載
- 12. 超載運營商<<
- 13. 運營商<<重載
- 14. 虛擬<<運營商
- 15. Ruby:<< - 運營商
- 16. 運營商=在C++中
- 17. C#&&,||運營商
- 18. C#? :運營商
- 19. C++使用,而不是運營商運營商INT()+
- 20. 即使我超載`運營商<<`
- 21. 使用新的運營商在C++
- 22. 一起使用任何運營商,字符串函數
- 23. 嘗試使用|創建字符串的值或運營商
- 24. 使用REGEX解析搜索字符串與布爾運營商
- 25. PHP使用字符串作爲運營商
- 26. 超負荷運營商<<在C++類中的
- 27. 全球運營商<<和成員運營商之間的共存<<
- 28. 使用運營商
- 29. 使用「?」運營商
- 30. C#| =和&=運營商
這看起來像一個家庭作業問題可疑。 – 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