關於string類的倒序和反向迭代器
阿新 • • 發佈:2019-02-10
原文連結http://blog.csdn.net/easyiocp/article/details/7172434
如何用c++來實現字串的倒序呢
我直接想到的是利用反向迭代器reverse_iterator:rbegin()和rend():
string str1("1234567890");
string str2(str1.rbegin(), str1.rend());
這是利用operator=(const string&),別忘了還有成員函式assign這個利器:
string str1("1234567890"); str1.assign(str1.rbegin(), str1.rend());
這是使用了成員函式assign的一種過載:
template<class InputIterator>
basic_string& assign(InputIterator first, InputIterator last);
不過這很容易產生疑問(這少我是產生了):看起來都是在相同的記憶體上操作,會不會有問題。類似memcpy的src和dst有重疊的情況?
C++標準告訴我們,是不會有問題的——標準(ISO2003)21.3.5.3:
template<class InputIterator>basic_string& assign(InputIterator first, InputIterator last); Returns: assign(basic_string<charT,traits,Allocator>(first,last))
原來會產生一個臨時變數:basic_string<charT,traits,Allocator>(first,last)。疑慮消除了。
但是,能不能直接在string中逆序元素呢?這樣就避免了臨時變數的產生。自己動手寫是不難,不過,STL中提供了大量的演算法,看看其中有沒有我們需要的:
template <class BidirectionalIterator> void reverse ( BidirectionalIterator first, BidirectionalIterator last) { while ((first!=last)&&(first!=--last)) swap (*first++,*last); }
這個template <class BidirectionalIterator> void reverse ( BidirectionalIterator first, BidirectionalIterator last)相當不錯,完美解決了我們的問題:
str1("1234567890");
reverse(str1.begin(), str1.end());