[英]Why std::equal crashes if second vector empty
我正在使用<algorithm>
中定義的std::equals
來檢查兩個向量是否相等。 當第二個向量為空時它會崩潰。 我可以通過檢查第二個向量是否為空來避免崩潰,但是是否有理由不將檢查包含在equal
function 本身中?
示例代碼:
std::vector<int> a;
for (int i = 0; i < 3; ++i) a.emplace_back(i);
std::vector<int> b;
for (int i = 0; i < 0; ++i) b.emplace_back(i);
std::equal(a.begin(), a.end(), b.begin());
您將std::equal
稱為 3 arguments,在https://en.cppreference.com/w/cpp/algorithm/equal 中說:
如果范圍 [first1, last1) 等於范圍 [first2, first2 + (last1 - first1)),則返回 true,否則返回 false
在您的情況下,這將導致未定義的行為
使用std::equal
與 4 arguments 代替:
std::equal(a.begin(), a.end(), b.begin(), b.end());
這將做:
如果范圍 [first1, last1) 等於范圍 [first2, last2),則返回 true,否則返回 false。
這就是你想要的。
或者,您可以只使用 operator ==
。 std::vector
重載一個:
a == b;
此調用中比較元素的范圍(作為比較次數)
std::equal(a.begin(), a.end(), b.begin());
由前兩個 arguments [a.begin(), a.end() )
指定。 但是這個范圍對於向量b
是無效的。
使用這種形式的算法
template<class InputIterator1, class InputIterator2>
bool equal(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2);
其中,兩個比較容器的范圍分別指定為
std::equal(a.begin(), a.end(), b.begin(), b.end());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.