是否有可能安全地尋找std::string::iterator
到給定的位置?C++尋找一個std :: string :: iterator到給定的位置
的std :: string ::迭代器有一個偏移訪問運算符(運算符[]),但它在某些人如不確定的行爲定義,像it + 3
類別存在。
是否有可能安全地尋找std::string::iterator
到給定的位置?C++尋找一個std :: string :: iterator到給定的位置
的std :: string ::迭代器有一個偏移訪問運算符(運算符[]),但它在某些人如不確定的行爲定義,像it + 3
類別存在。
的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
感謝您的解決方案(糾正我)!哈哈,你讓我覺得很愚蠢。 – Tim
我不知道你在哪裏得到的想法,operator[]
是UB的std::string::iterator
。它被定義爲隨機訪問迭代器,它支持i[n]
以及i + n
。
根據其他地方的評論,看起來你是在絕對定位之後(這從你的問題的措辭不是很清楚)。你不能從一個你不知道的位置的迭代器那樣做,但是你可以通過相對於由begin()
返回的迭代器,即:str.begin()[3]
或str.begin() + 3
,來實現相同的效果。如果你沒有方便的原始字符串,你會被打爛。
標準迭代器是這樣指定的,它們不需要引用它們迭代的容器(或其他序列);這意味着無法僅使用迭代器進行「絕對搜索」。你需要從字符串中得到一個新的迭代器,檢查它是否在範圍內;是這樣的:
std::string::iterator seek(std::string & s, size_t i) {
return s.length() <= i ? s.end() : s.begin() + i;
}
算法隨機訪問迭代器,並operator[]
對字符串,是明確的,只要你留在範圍之內。如果你超出範圍,行爲僅僅是不確定的。
你能解釋一下你的問題嗎?和你安全的*意味着什麼? –
誰說'it + 3'有未定義的行爲?它們是錯誤的(除了迭代超過字符串末尾的情況)。 – Mankarse