C/C++ 字串反轉 reverse

今天 ShengYu 要介紹的是如何將 C/C++ 字串反轉 reverse,算是個很常考的考題,熟悉以後也可以將 vector 容器內容元素進行反轉。

自己動手寫一個

字串反轉其實就是用了 swap 的技巧來達成,用迴圈將第一個跟最後一個交換,
接著將第二個跟倒數第二個交換,依此類推,所以可以寫成這樣,

string-reverse.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// g++ string-reverse.cpp -o a.out
#include <iostream>
#include <string>
using namespace std;

void swap(char *x, char *y) {
char tmp = *x;
*x = *y;
*y = tmp;
}

void reverse(char *first, char *last) {
--last;
while (first < last) {
swap(first, last);
++first;
--last;
}
}

int main() {
char str[] = "Hello World";
reverse(&str[0], &str[11]);
cout << str << endl;

/*std::string str2 = "Hello World";
reverse(str2.begin(), str2.end());
cout << str2 << endl;*/

return 0;
}

輸出如下

1
dlroW olleH

經過樣板修改後,就可以處理任意型態的反轉了,

string-reverse-template.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// g++ string-reverse-template.cpp -o a.out
#include <iostream>
#include <string>
using namespace std;

template <typename T>
void swap(T *x, T *y) {
T tmp = *x;
*x = *y;
*y = tmp;
}

template <typename T>
void reverse(T *first, T *last) {
--last;
while (first < last) {
swap(first, last);
++first;
--last;
}
}

int main() {
char str[] = "Hello World";
reverse(&str[0], &str[11]);
cout << str << endl;

int arr[] = {4, 5, 6, 7};
reverse(&arr[0], &arr[4]);
for(auto i : arr)
std::cout << i;
std::cout << '\n';

/* not work
std::string str2 = "Hello World";
reverse(str2.begin(), str2.end());
cout << str2 << endl;*/

return 0;
}

輸出如下

1
2
dlroW olleH
7654

使用 std::reverse

STL 已經有提供 reverse 函式可以使用了,C++11 才加入的,只需 #include <algorithm> 並且加入 -std=c++11 編譯選項就可使用,使用的範例如下,

std-reverse.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// g++ std-reverse.cpp -o a.out -std=c++11
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
char str[] = "Hello World";
std::reverse(&str[0], &str[11]);
// or
//std::reverse(&str[0], &str[sizeof(str)-1]);
cout << str << endl;

std::string str2 = "Hello World";
std::reverse(str2.begin(), str2.end());
cout << str2 << endl;

int arr[] = {4, 5, 6, 7};
std::reverse(std::begin(arr), std::end(arr));
for(auto i : arr)
std::cout << i;
std::cout << '\n';

std::vector<int> vec{1, 2, 3};
std::reverse(std::begin(vec), std::end(vec));
for (auto i : vec)
std::cout << i;
std::cout << '\n';

return 0;
}

輸出如下

1
2
3
4
dlroW olleH
dlroW olleH
7654
321

以上就是 C/C++ 字串反轉 reverse 的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

參考
std::reverse - cppreference.com
https://en.cppreference.com/w/cpp/algorithm/reverse
reverse - C++ Reference
http://www.cplusplus.com/reference/algorithm/reverse/

其它相關文章推薦
C/C++ 新手入門教學懶人包
C++ std::sort 排序用法與範例完整介紹
std::queue 用法與範例
C++ virtual 的兩種用法
C/C++ 判斷檔案是否存在
C/C++ 取得 shell 指令的螢幕輸出字串
C++ 設計模式 - 單例模式 Singleton Pattern
C/C++ call by value傳值, call by pointer傳址, call by reference傳參考 的差別