Ich fordere mich selbst heraus, einen Palindrome-Tester zu schreiben, der nur SL-Algorithmen, Iteratoren usw. verwendet. Ich möchte auch mit rohen Strings arbeiten. Im Folgenden verwende ich den rohen Zeiger pal
im copy_if
Algorithmus, aber stattdessen, wie könnte ich einen Iterator definieren, um hier zu gehen, d. H. Mit etwas wie begin(pal)
und end(pal + size)
?Erhalte einen Iterator von einem Char-Zeiger (C++)
#include <algorithm>
#include <iterator>
#include <cctype>
using namespace std;
bool isPalindrome(const char* pal) {
if (!pal) { return(false); }
int size = strlen(pal);
string pal_raw;
pal_raw.reserve(size);
// Copy alphabetical chars only (no spaces, punctuations etc.) into pal_raw
copy_if(pal, pal+size, back_inserter(pal_raw),
[](char item) {return isalpha(item); }
);
// Test if palindromic, ignoring capitalisation
bool same = equal(begin(pal_raw), end(pal_raw), rbegin(pal_raw), rend(pal_raw),
[](char item1, char item2) {return tolower(item1) == tolower(item2); }
);
return same;
}
int main(){
char pal[] = "Straw? No, too stupid a fad. I put soot on warts.";
bool same = isPalindrome(pal);
return 0;
}
Bonus Frage: Ist es möglich, die Notwendigkeit zu copy_if()
durch Erhöhen der Iteratoren ‚anstelle‘ zu eliminieren aus equal()
das heißt, wenn !isalpha(item)
?
Warum nicht 'std :: string' anstelle eines char-Arrays verwenden? – NathanOliver
@NathanOliver Ich habe schon eine Überladung für 'std :: string' geschrieben, wollte auch in der Lage sein, char Arrays zu handhaben. –
Ein Zeiger bereits * ist * ein Iterator. –