[英]Arranging a string in uppercase-first alphabetical order C++
我試圖用C ++創建一個程序,按照字母順序對給定字符串進行排序,其方式是大寫字母在它們的小寫等價物之前。 示例:DCBAdcba已排序字符串:AaBbCcDd
以下是代碼。
#include <iostream>
#include <string>
#include <cctype>
struct char_ {
char c;
char diff;
char_();
char_(char x);
};
char_::char_() {
c = 0;
diff = 0;
}
char_::char_(char x) {
c = std::tolower(x);
diff = c - x;
}
void charswap(char_& x, char_& y) {
char_ temp;
temp = x;
x = y;
y = temp;
}
int main() {
std::string str;
getline(std::cin, str);
char_* str2 = new char_[str.length()];
for (int i = 0; i < str.length(); i++) {
str2[i] = char_(str[i]);
}
/*
for (int i = 0; i < str.length(); i++) {
std::cout << str2[i].c << std::endl;
}
*/
for (int i = 0; i < str.length(); i++) {
for (int j = i; j < str.length(); j++) {
if (str2[i].c > str2[j].c)
charswap(str2[i], str2[j]);
}
}
for (int k = 0; k < str.length(); k++) {
std::cout << str2[k].c << "\t" << (int)str2[k].diff << std::endl;
}
for (int i = 0; i < str.length(); i++) {
str2[i].c = str2[i].c - str2[i].diff;
}
for (int i = 0; i < str.length(); i++) std::cout << str2[i].c;
std::cout << "\n";
return 0;
}
創建char_ struct以存儲單個字符(轉換為小寫)以及它們與大寫等效項的區別(0或32,具體取決於原始字符分別是小寫字母還是大寫字母)。 然后它根據它們的小寫值對char_字符進行排序。 在排序之后,我們將差異添加回字符以檢索大寫形式。
但是當我嘗試給出這個字符串時,它給出了以下結果。
DCBAdcba
AABBCCDD
我無法理解這里發生了什么。
問題出在這一行:
if (str2[i].c > str2[j].c)
charswap(str2[i], str2[j]);
它以不區分大小寫的方式比較字符,當小寫字符相同時沒有提供打破平局的規定。
如果右側的小寫大於左側的小寫,或者小寫表示相同,但右側原始字符為大寫,則需要修改此項以交換字符:
if ((str2[i].c > str2[j].c) || (str2[i].c == str2[j].c && str2[j].diff))
charswap(str2[i], str2[j]);
按字母順序對給定字符串進行排序,其方式是大寫字母位於其小寫等效字母之前。
您可以定義一個反映您意圖的比較仿函數
#include <cctype>
#include <iostream>
#include <vector>
#include <algorithm>
struct case_cmp {
bool operator()(char lhs, char rhs) const {
return (std::isupper(lhs) && std::tolower(lhs) == rhs) || std::tolower(lhs) < std::tolower(rhs);
}
};
然后使用std::sort
:
int main() {
std::string s("DCBAdcba");
std::sort(std::begin(s), std::end(s), case_cmp());
// Outputs "AaBbCcDd"
std::cout << s << std::endl;
}
std::string
可以被視為char
的容器 ,因此你可以將STL的算法應用於其內容,包括std::sort()
(就像你將STL算法應用於例如std::vector
)。
您可以使用lambda指定特定的自定義排序條件 ,作為第三個參數傳遞給std::sort()
,例如( 在Ideone上生效 ):
#include <algorithm> // for std::sort
#include <cctype> // for std::isupper, std::tolower
#include <iostream> // for std::cout
#include <string> // for std::string
using namespace std;
int main() {
string s{"DCBAdcba"};
sort( s.begin(), s.end(), [](char x, char y) {
// Custom sorting criteria.
// Return true if x precedes y.
// This may work, but requires more testing...
if (isupper(x)) {
if (tolower(x) == y) {
return true;
}
}
return tolower(x) < tolower(y);
});
cout << s << '\n';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.