有条件地测试向量元素的相等性

时间:2011-04-03 04:21:00

标签: c++ algorithm

虽然看起来很简单,但我不确定最有效的方法。

我有两个向量:

std::vector<bool> a;
std::vector<int> b;

a.size()必须等于b.size()

a中的每个bool对应b中的int。我想创建一个函数:

bool test(std::vector<bool> a, std::vector<int> b);

如果true中的值相等,则此函数返回a。但是,它仅考虑a中与true中的b值相对应的值。

我可以这样做:

bool test(std::vector<int> a, std::vector<bool> b){
    int x;
    unsigned int i;
    for(i = 0; i < a.size(); ++i){
        if(b.at(i) == true){
            x = a.at(i);
            break;
        }
    }
    for(i = 0; i < a.size(); ++i){
        if(b.at(i) == true){
            if(a.at(i) != x){
                return false;
            }
        }
    }
    return true;
}

但是我必须创建两个循环。虽然第一个循环将停在第一个真值,但还有更好的方法吗?

4 个答案:

答案 0 :(得分:3)

如果您记得在true中看过第一个b元素,可以在一个循环中完成。此外,您应该通过引用获取ab参数,以避免不必要的复制。最后,如果您知道向量中的索引始终在有效范围内(即介于0和vector.size() - 1之间),则可以使用operator[]代替at,并且实现更好的性能(at进行范围检查,而operator[]不进行范围检查。下面是考虑到以上所有要点的test函数的修改版本:

bool test(std::vector<int> const& a, std::vector<bool> const& b){
    int x;
    bool first = true;
    for(unsigned i = 0, n = a.size(); i != n; ++i){
        if( b[i] ){
            if( first ) {
                x = a[i];
                first = false;
            }
            else if( x != a[i] ) {
                return false;
            }
        }
    }
   return true;
}

答案 1 :(得分:3)

您的解决方案对我来说足够好了:

  • 无论如何,每个循环都做了不同的事情(所以你不必担心重复)
  • 您不使用使代码复杂化的恶意变量或标志。

我看到的唯一问题是:

  • 你开始第二个循环为0而不是你离开的地方。
  • if(condition == true)非常难看。只需改为if(condition)

bool test(std::vector<int> a, std::vector<bool> b){
    int x;
    unsigned i;
    for(i = 0; i < a.size(); i++){
        if(b.at(i)){
            x = a.at(i);
            break;
        }
    }
    for(i++; i < a.size(); i++){
        if(b.at(i)){
            if(a.at(i) != x){
                return false;
        }
    }
    return true;

}

答案 2 :(得分:1)

如果您知道a.size()== b.size(),只需创建一个循环,在每次迭代的同时将'a'元素与'b'元素进行比较。一旦你看到[i]!= b [i],那么你知道容器不匹配,你可以爆发。

答案 3 :(得分:0)

我不是100%肯定我知道你想要做什么,但只要你知道你有相同的尺寸就可以直接比较

std::equal(a.begin(), a.end(), b.begin(), std::equal_to<bool>())