簡體   English   中英

C ++ STL:迭代器出現問題

[英]C++ STL: Trouble with iterators

我遇到了初學者的問題:

bool _isPalindrome(const string& str)
{
    return _isPalindrome(str.begin(), str.end()); // won't compile
}

bool _isPalindrome(string::iterator begin, string::iterator end)
{
    return begin == end || *begin == *end && _isPalindrome(++begin, --end);
}

我在這里做錯了什么? 為什么不將str.begin()類型檢查為string::iterator

更新:更好的版本:

bool BrittlePalindrome::_isPalindrome(string::const_iterator begin, string::const_iterator end)
{
    return begin >= end || *begin == *(end - 1) && _isPalindrome(++begin, --end);
}

str.begin()是非常量的,而參數str 常量。

您可以將iterator-accepting方法更改為接受const_iterator ,或者可以將string-accepting方法更改為接受非const string

或者您可以放棄str的常數,但這將是獲得專利的Bad Idea TM

(我還將在迭代器接受方法的括號內加上您的return語句,以使您的意圖更加清楚,但這既不存在也不存在。)

假設您在第一個函數之前聲明了第二個函數,則主要問題是要通過const引用傳遞字符串。

這意味着您可以訪問的begin()end()唯一的重載是返回std::string::const_iterator而不是std::string::iterator的const版本。

迭代器的約定是,結束迭代器指向一個超出范圍末尾的str.end() ,並且不可取消引用-當然,如果您將str.end()作為end參數進行傳遞。 這意味着*begin == *end無效,您需要先減少一次end。 您還會遇到元素奇數范圍的問題。 通過不做進一步檢查++begin--end ,您的迭代器可能會在遞歸中交叉,而不是觸發begin == end條件。

還要注意,為了獲得最大的可移植性,全局標識符不應以下划線開頭。

如前所述,您的迭代器需要是常量迭代器,但是您的算法存在其他問題。 如果您的字符串長度為奇數,則可以正常工作,但是您看到字符串為偶數長度時會發生什么情況? 考慮回文:

a

您的算法將傳入指向前端和后端的迭代器。 一切都很好,然后它將進入一個新的水平,並且一​​切都會很好,但是不會結束。 因為您的第一個條件永遠不會成立。 如果需要,您不僅需要檢查begin == end是否開始,還需要檢查begin + 1 == end還是begin == end-1。 否則,您的迭代器將不高興。

你遇到了什么錯誤?

你有嘗試過嗎?

bool _isPalindrome(字符串:: const_iterator開始,字符串:: const_iterator結束)

  1. const_iterator替換iterator
  2. 交換功能定義
  3. 遞減end

碼:

bool isPalindrome(string::const_iterator begin, string::const_iterator end)
{
  return (begin == end || begin == --end || 
          *begin == *end && isPalindrome(++begin, end));
}

bool isPalindrome(const string& str)
{
    return isPalindrome(str.begin(), str.end());
}

在第一個函數中調用它之前,您尚未聲明第二個函數。 編譯器找不到它,因此嘗試將str.begin()(string :: iterator)轉換為const字符串&。 您可以將第一個功能移到第二個功能后面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM