2014-10-03 62 views
-1

我想找到字符串數組中的最小元素,但我無法弄清楚如何做到這一點。我想出了這個代碼思想,它完美適用於整數,但不適用於字符串。這將編譯,雖然它只檢查字符串中的第一個字符的ASCII值。換句話說,在字符串數組中:lists[5] = { "aaa", "z", "cccc", "tt", "jjj"};列表[1]「z」是字符串的最小元素。但是,因爲'a'是較低的ASCII值,所以代碼將打印出Smallest aaa而不是Smallest z。現在我知道我可以使用.length對字符串中的每個字符進行某種深刻的同情,但是我想用一些簡單的東西來解決這個問題,因爲我想將它添加到一個將被重載爲一個整數的函數中我可以在字符串和整數比較之間來回切換。但如果這是不可能的,我將只有兩個獨立的函數來處理每個函數。字符串數組中的最小元素C++

如果您有任何關於如何找到字符串數組中最小元素的建議,該怎麼辦?

#include <iostream> 
#include <string> 
#include <algorithm> 

using namespace std; 

int main() { 


string lists[5] = { "aaa", "z", "cccc", "tt", "jjj"}; 
    string smallests; 
    smallests = lists[0]; 
    for (int i = 0; i < 5; i++){ 
     cout << smallests << endl; 
     if (lists[i] < smallests){ // Flip <to> to find largest 
      smallests = lists[i]; 
     } 
    } 
    cout << "Smallest " << smallests << endl; 
    cout << *min_element(lists, lists + 5) << endl; 

return 0; 
} 
+4

如最小長度?或按字母順序? – CoryKramer 2014-10-03 19:56:24

+0

好吧,但我現在可以看到按字母順序排列。如字符串列表[5] = {「a」,「z」,「c」,「t」,「j」};都將是相同的長度。但一次只能做一件事,因爲那張支票就是現在的代碼。 – 2014-10-03 20:00:55

回答

6

最簡單的做法是注意std::min_element可以傳遞一個自定義比較函數。所以,讓我們定義最小的意思。

從評論看來,你想要更短的字符串,然後按字典順序對它們進行排序。

#include <string> 
#include <algorithm> 
#include <iostream> 

bool smallest(std::string const & lhs, std::string const & rhs) { 
    if (lhs.size() < rhs.size()) 
     return true; 
    if (lhs.size() == rhs.size() && lhs < rhs) 
     return true; 
    return false; 
} 

int main() { 
    std::string lists[5] = { "aaa", "z", "cccc", "tt", "jjj"}; 
    std::cout << *std::min_element(lists, lists + 5, smallest) << "\n"; 
} 

,其輸出:

z 
+0

嘿,這是一個不錯的主意。 – 2014-10-03 20:13:05

-3

的<運營商不會對C.字符串的工作,你需要使用string.h中提供的strcmp

http://www.tutorialspoint.com/c_standard_library/string_h.htm

您的代碼進行比較就變成了:

if (strcmp(lists[i], smallests) < 0) { 
    smallests = lists[i]; 
} 
+5

這是C++。 'operator <'是非常明確的。 – 2014-10-03 20:07:25

+0

這是C++,並且字符串類HAVE <操作符(列表是字符串類型的) – PhpLou 2014-10-03 20:07:55

+1

如果不使用'c_str'函數,則不起作用。 – 2014-10-03 20:14:56