1. 程式人生 > >關於string類的倒序和反向迭代器

關於string類的倒序和反向迭代器

原文連結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());