這個輪子已經發明瞭,存在於標準庫中。
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string word;
std::cout << "Enter a word: ";
std::cin >> word;
std::reverse(word.begin(), word.end());
std::cout << "Reverse: " << word << std::endl;
return 0;
}
準確瞭解是怎麼回事,有幾件事情,你必須覆蓋第一:
我希望你已經知道一個班級是什麼。如果你仍然在介紹性的東西,一個類基本上是用戶定義的狀態和行爲的集合。由於各種原因,作者可以選擇限制對課程的狀態或行爲的訪問。在std::string
的情況下,標準庫字符串類,所有的狀態都是隱藏的,只有行爲可以訪問。
字符串類是一個包含字符的容器。還有很多其他的容器類,每個容器類都有不同的長處和短處。字符串類包含一個嚴格順序的字符序列。還有其他容器,如std::set
,std::vector
,std::list
等。 std::string
與std::vector
相似,並且是std::list
的遠房親戚。每個集合的行爲都不同,適用於不同的事物。
您可能會認爲您需要了解字符串類如何存儲其數據才能將其反轉,但是您不知道。這是迭代器進來的地方。std::string
擁有一個typedef,std::string::iterator
,它是一個存儲單個元素在字符串中的位置的特殊對象。 std::reverse
是一個庫函數,它需要2個迭代器並反覆交換其內容並將它們移向彼此。這看起來像這樣:
v v <-- positions of iterators (start at the start, end at the end)
ABC <-- initial state
v v <-- the end iterator moved back
ABC
v v
CBA <-- the iterators swapped their values
vv <-- the begin iterator moved forward
CBA
V <-- the end iterator moved back; both iterators are in the same place
CBA <-- therefore, we're done, the string is reversed
關於迭代器的一件事是它們有點像指針。事實上,你可以傳遞指向一些期望迭代器的函數的指針,因爲它們在語法上相同。因此,您應該可以編寫自己的反向函數,它使用的指針基本上與此相同,除了char *
s。
下面是一些僞代碼,你應該能夠編寫的函數(我不會寫出來完全是因爲它是家庭作業):
namespace BaidNation
{
void reverse(char *begin, char *end)
{
loop forever
{
if (end equals begin):
done;
move end backwards;
if (end equals begin):
done;
swap end's and begin's characters;
move begin forwards;
}
}
}
請記住,BaidNation::reverse
(以及std::reverse
)預計,用於結束引用元素的集合的末尾的的迭代器,而不是引用最後一個元素的元素。那麼如何使用它是有意義的?
您的LengthOfString
函數返回字符串中非空字符的數量。由於數組是零索引的,我們知道像其他數組一樣,如果我們檢查string1 + LengthOfString(string1)
,我們會在結束之後得到一個指向該字符的指針,這正是我們想要的。
因此,我們可以用它來扭轉字符串:
int reverse(const char str[])
{
char *start = str, *end = str + LengthOfString(str);
BaidNation::reverse(start, end);
}
來源
2013-06-18 17:38:31
Wug
這聽起來像一個家庭作業的問題。 –
你有沒有做過任何嘗試?你能向我們展示你認爲的解決方案嗎? – Shobit
@DrewShafer不再有作業標籤。關於meta的iirc有一些討論。 – jpaugh