设为首页 加入收藏

TOP

8.8.4 比较字符串
2013-10-07 12:37:00 来源: 作者: 【 】 浏览:59
Tags:8.8.4 比较 字符串

8.8.4  比较字符串

我们有一整套比较运算符,用来比较两个字符串对象,或者比较一个字符串对象与一个字符串字面值。string类中对下列运算符实现了运算符重载:

  1. == != < <> >

下面是使用这些运算符的示例:

  1. string dog1("St Bernard");  
  2. string dog2("Tibetan Mastiff");  
  3. if(dog1 < dog2)  
  4. cout << "dog2 comes first!" << endl;  
  5. else if(dog1 > dog2)  
  6. cout << "dog1 comes first!" << endl

当我们比较两个字符串时,实际上是比较对应的字符,直到发现一对不同的字符,或者到达一个或两个字符串的末尾。当发现两个对应字符不相同时,字符代码的值决定比较结果。如果没有发现不同的字符对,那么字符较少的字符串小于另一个字符串。如果两个字符串包含相同的字符个数,而且对应的字符也相同,则这两个字符串相等。

试一试:比较字符串

本例说明了如何用极其低效的排序方法来使用比较运算符。代码如下:

  1. // Ex8_10.cpp  
  2. // Comparing and sorting words  
  3. #include <iostream> 
  4. #include <iomanip> 
  5. #include <string> 
  6. using std::cin;  
  7. using std::cout;  
  8. using std::endl;  
  9. using std::ios;  
  10. using std::setiosflags;  
  11. using std::setw;  
  12. using std::string;  
  13.  
  14. string* sort(string* strings, size_t count)  
  15. {  
  16. bool swapped = false;  
  17. while(true)  
  18. {  
  19. for(size_t i = 0 ; i<count-1 ; i++)  
  20. {  
  21. if(strings[i] > strings[i+1])  
  22. {  
  23. swapped = true;  
  24. strings[i].swap(strings[i+1]);  
  25. }  
  26. }  
  27. if(!swapped)  
  28. break;  
  29. swapped = false;  
  30. }  
  31. return strings;  
  32. }  
  33.  
  34. int main()  
  35. {  
  36. const size_t maxstrings = 100;  
  37. string strings[maxstrings];  
  38. size_t nstrings = 0;  
  39. size_t maxwidth = 0;  
  40.  
  41. // Read up to 100 words into the strings array  
  42. while(nstrings < maxstrings)  
  43. {  
  44. cout << "Enter a word or press Enter to end: ";  
  45. getline(cin, strings[nstrings]);  
  46. if(maxwidth < strings[nstrings].length())  
  47. maxwidth = strings[nstrings].length();  
  48. if(strings[nstrings].empty())  
  49. break;  
  50. ++nstrings;  
  51. }  
  52.  
  53. // Sort the input in ascending sequence  
  54. sort(strings,nstrings);  
  55. cout << endl 
  56. << "In ascending sequence, the words you entered are:"  
  57. << endl 
  58. << setiosflags(ios::left);          // Left-justify the output  
  59. for(size_t i = 0 ; i<nstrings ; i++)  
  60. {  
  61. if(i % 5 == 0)  
  62. cout << endl;  
  63. cout << setw(maxwidth+2) << strings[i];  
  64. }  
  65. cout << endl;  
  66. return 0;  

下面是该示例的一些典型输出:

  1. Enter a word or press Enter to end: loquacious  
  2. Enter a word or press Enter to end: transmogrify  
  3. Enter a word or press Enter to end: abstemious  
  4. Enter a word or press Enter to end: facetious  
  5. Enter a word or press Enter to end: xylophone  
  6. Enter a word or press Enter to end: megaphone  
  7. Enter a word or press Enter to end: chauvinist  
  8. Enter a word or press Enter to end:  
  9.  
  10. In ascending sequence, the words you entered are:  
  11.  
  12. abstemious chauvinist   facetious   loquacious megaphone  
  13. transmogrify xylophone 

示例说明

sort()函数最有趣的部分是它接受两个实参:字符串数组的地址与数组元素的个数。

该函数使用冒泡排序法,方法是按顺序扫描元素并逐个比较它们。所有工作都在while循环中完成:

  1. bool swapped = false;  
  2. while(true)  
  3. {  
  4. for(size_t i = 0 ; i<count-1 ; i++)  
  5. {  
  6. if(strings[i] > strings[i+1])  
  7. {  
  8. swapped = true;  
  9. strings[i].swap(strings[i+1]);  
  10. }  
  11. }  
  12. if(!swapped)  
  13. break;  
  14. swapped = false;  

上述代码中用>运算符比较strings数组中的逐个元素。如果一对元素中第一个元素大于第二个元素,就交换这两个元素。在这种情况下,通过调用一个string对象的swap()函数,并将另一个string对象作为实参来交换元素。当有必要继续时,对整个数组的元素逐个比较并进行交换。然后,元素就变成了升序排列。bool变量swapped充当指示器,表明在给定的通道(pass)上有没有发生交换。仅当交换两个元素时,才会将它设置为true。

main()函数最多能在一个循环中向字符串数组中读入100个单词:

  1. while(nstrings < maxstrings)  
  2. {  
  3. cout << "Enter a word or press Enter to end: ";  
  4. getline(cin, strings[nstrings]);  
  5. if(maxwidth < strings[nstrings].length())  
  6. maxwidth = strings[nstrings].length();  
  7. if(strings[nstrings].empty())  
  8. break;  
  9. ++nstrings;  

这里getline()函数从cin中读取字符,直至读到'\n'。输入存储在第二个实参strings[nstrings]指定的string对象中。只需按下Enter键就会导致一个empty()字符串,因此当读取的最后一个string对象的empty()函数返回true时终止循环。maxwidth变量用来记录输入的最长字符串的长度。在对输入内容进行排序以后的输出过程中会用到它。

调用sort()函数可以按升序对strings数组中的内容进行排序。结果是在一个循环中输出:

  1. cout << endl 
  2. << "In ascending sequence, the words you entered are:"  
  3. << endl 
  4. << setiosflags(ios::left); // Left-justify the output  
  5. for(size_t i = 0 ; i<nstrings ; i++)  
  6. {  
  7. if(i % 5 == 0)  
  8. cout << endl;  
  9. cout << setw(maxwidth+2) << strings[i];  
这段代码在宽度为maxwidth+2个字符的字段中输出各个元素。因为调用了setiosflags()操作符,实参为ios::left,所以字段中的各个单词保持左对齐。与setw()操作符不同,在重置之前setiosflags()操作符仍然有效。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇8.9 C++/CLI编程 下一篇8.8.2 连接字符串

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: