簡體   English   中英

如果第二個向量為空,為什么 std::equal 會崩潰

[英]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.

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