2012-12-20 61 views
3

是否有可能安全地尋找std::string::iterator到給定的位置?C++尋找一個std :: string :: iterator到給定的位置

的std :: string ::迭代器有一個偏移訪問運算符(運算符[]),但它在某些人如不確定的行爲定義,像it + 3類別存在。

cplusplus.com reference

+0

你能解釋一下你的問題嗎?和你安全的*意味着什麼? –

+0

誰說'it + 3'有未定義的行爲?它們是錯誤的(除了迭代超過字符串末尾的情況)。 – Mankarse

回答

2

的std :: string ::迭代器有一個偏移訪問運算符(運算符[]),但它存在於一些人的不確定的行爲定義的範疇,就像+ 3

我不明白這個說法。沒有這樣的類別。 std::basic_string<>::iterator是隨機訪問迭代器,因此你可以僅僅通過增加或減去偏移/從它(這是與文檔一致您鏈接到)尋求:

auto new_it = it + offset; 

什麼是未定義正在尋求過去end()迭代器或者在開始之前。也就是說,以下是不確定的行爲:

std::string str = "hi"; 
auto it1 = str.begin() + 2; // OK. 
assert(it1 == str.end()); 
auto it2 = str.begin() + 3; // UB! 
// At this point we cannot assert anything about it2 
+0

感謝您的解決方案(糾正我)!哈哈,你讓我覺得很愚蠢。 – Tim

1

我不知道你在哪裏得到的想法,operator[]是UB的std::string::iterator。它被定義爲隨機訪問迭代器,它支持i[n]以及i + n

根據其他地方的評論,看起來你是在絕對定位之後(這從你的問題的措辭不是很清楚)。你不能從一個你不知道的位置的迭代器那樣做,但是你可以通過相對於由begin()返回的迭代器,即:str.begin()[3]str.begin() + 3,來實現相同的效果。如果你沒有方便的原始字符串,你會被打爛。

1

標準迭代器是這樣指定的,它們不需要引用它們迭代的容器(或其他序列);這意味着無法僅使用迭代器進行「絕對搜索」。你需要從字符串中得到一個新的迭代器,檢查它是否在範圍內;是這樣的:

std::string::iterator seek(std::string & s, size_t i) { 
    return s.length() <= i ? s.end() : s.begin() + i; 
} 

算法隨機訪問迭代器,並operator[]對字符串,是明確的,只要你留在範圍之內。如果你超出範圍,行爲僅僅是不確定的。

相關問題