許多標準庫容器的操作都接受迭代器指定的範圍。例如,std::list::assign(InputIterator first, InputIterator last)
。如何檢查迭代器指定的範圍是否有效?
但是,因爲這些操作中的很多不會拋出異常,所以如果[first,last)
指定的範圍無效,則會導致未定義的行爲。
那麼是有效範圍?我認爲這意味着first
之前或等於last
在容器中,因爲當我另外嘗試(即first
之後來到last
),程序的執行會掛起。
例如:
std::list.assign(container.begin(), container.end()); // valid range
std::list.assign(container.end(), container.begin()); // invalid range
用的有效範圍是什麼假設
現在,我們怎麼能檢查的範圍是有效的?
我想出了一個幫助函數,它在到達容器末尾之前檢查first
是否等於last
。如果屬實,那麼first
不會在last
之後出現,因此該範圍有效。
template <typename Iterator>
bool isValidRange(Iterator first, Iterator last, Iterator end)
{
for (; first != end; ++first)
if (first == last) return true;
return false;
}
這不是很方便,因爲除了指定範圍的迭代器之外,您還必須將它傳遞給容器的末端。
這是正確的嗎?有一個更好的方法嗎?
要檢查範圍是否有效,請增加第一個迭代器直到它等於第二個;那麼你知道它是有效的。如果它不等於第二個,那麼範圍是無效的。 –
更嚴重的一點是:不要將範圍和容器等同起來。容器是創建範圍的一種方式,但它們不是唯一的方法。例如,輸入流中的迭代器不是來自容器。 –
@PeteBecker在這種情況下,爲什麼像'list_a.assign(list_b.end(),list_b.begin());'掛起程序? 'std :: list :: end'和'std :: list :: begin'返回一個雙向迭代器,所以第一個迭代器最終會到達第二個迭代器,這意味着它應該根據你的描述是有效的。 – Dennis