【问题标题】:how to check if all of a vector values are equal to a determined value如何检查所有向量值是否等于确定值
【发布时间】:2021-05-02 18:15:26
【问题描述】:

我有这个代码:

int generatore(std::vector<bool> vettore, int *x) {
    int y;
    
    if (std::adjacent_find(vettore.begin(), vettore.end(), std::not_equal_to<>()) == vettore.end() {
        return *x + 1;
    }
    else {
        do {
            y = rand() % *x;
        } while (vettore.at(y) == true);

        return y;
    }
}

这个函数所做的基本上是获取一个 vector,它存储布尔值,表示索引是否已被使用及其 size,当它被调用时它应该返回未使用的索引或 *x+1(如果所有这些都已使用)。 用作参数的向量永远不会为空。 false 值意味着该索引尚未使用,此代码的问题是,如果所有值都等于 false,它会返回 *x+1 而不是选择一个随机索引,所以我应该只检查所有值是否等于 true,我应该改变什么?

【问题讨论】:

  • 你有一个错字。在比较中== vettore.end 应该是== vettore.end()
  • 哦,谢谢,我太笨了以至于没有注意到...我在编辑中写了另一个问题,你能不能帮我解决这个问题?

标签: c++ if-statement vector error-handling


【解决方案1】:

您的if 条件已经检查了向量中的所有值是否相同,因此您可以检查第一个元素是否也是您想要的:

if (vettore.front() == false   // add this
    && std::adjacent_find(vettore.begin(), vettore.end(), std::not_equal_to<>()) == vettore.end()) { 
  // ...
}

adjacent_find 之前执行此检查可以避免对算法的评估。

您也可以使用all_of 算法:

if (std::all_of(vettore.begin(), vettore.end(), [](auto b) { return !b; })) {
  // ...
}

【讨论】:

  • std::all_of 接受谓词,而不是值。在您的第一个示例中,我可能会先进行相等性测试,以短路调用算法。
  • @Blastfurnace 哎呀,这太粗心了。谢谢你抓住那个。显然,OP 在接受之前只尝试了第一个解决方案:/ 哦,是的,关于在第一个解决方案中交换支票的好点。
猜你喜欢
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 2021-05-27
  • 2020-02-10
  • 2015-11-24
相关资源
最近更新 更多