虽然看起来很简单,但我不确定最有效的方法。
我有两个向量:
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;
}
但是我必须创建两个循环。虽然第一个循环将停在第一个真值,但还有更好的方法吗?
答案 0 :(得分:3)
如果您记得在true
中看过第一个b
元素,可以在一个循环中完成。此外,您应该通过引用获取a
和b
参数,以避免不必要的复制。最后,如果您知道向量中的索引始终在有效范围内(即介于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)
您的解决方案对我来说足够好了:
我看到的唯一问题是:
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>())