【问题标题】:Why std::equal crashes if second vector empty如果第二个向量为空,为什么 std::equal 会崩溃
【发布时间】:2022-01-08 14:36:46
【问题描述】:

我正在使用<algorithm> 中定义的std::equals 来检查两个向量是否相等。当第二个向量为空时它会崩溃。我可以通过检查第二个向量是否为空来避免崩溃,但是是否有理由不将检查包含在 equal 函数本身中?

示例代码:

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());

【问题讨论】:

标签: c++ vector std


【解决方案1】:

您使用 3 个参数调用 std::equal,在 https://en.cppreference.com/w/cpp/algorithm/equal 中表示:

如果范围 [first1, last1) 等于范围,则返回 true [first2, first2 + (last1 - first1)),否则为假

在你的情况下会导致未定义的行为

使用带有 4 个参数的 std::equal 代替:

std::equal(a.begin(), a.end(), b.begin(), b.end());

会做的:

如果范围 [first1, last1) 等于范围,则返回 true [first2, last2),否则为 false。

这就是你想要的。

或者,您可以只使用运算符==std::vector 重载一个:

a == b;

【讨论】:

    【解决方案2】:

    此调用中比较元素的范围(作为比较次数)

    std::equal(a.begin(), a.end(), b.begin());
    

    由前两个参数[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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多