2

我有一个vector<ClassA>(比如说my_vector,这个ClassA 本身是 ClassB 的向量),我想写if condition来测试条件,这样

(1)。如果只有一个元素不是空的,而其他所有元素都是空的,(因为 my_vector 的大小是 5,我应该一个接一个地测试这个非空的元素案例,例如 my_vector[0]、my_vector[1]、.. )

(2) 同样,如果两个元素不为空而其他元素为空(其他对类似)

(3) 同样,三个或三个以上的元素不为空

我正在考虑如何编码

这是我的尝试

if (!my_vector[0].empty() && my_vector[1].empty() && my_vector[2].empty() && .. &&  
         my_vector[4].empty()){ //process 1}
else if (!my_vector[1].empty() && my_vector[0].empty() && my_vector[2].empty() && ..){ 
         //process 2}
else if(!my_vector[2].empty() && my_vector[0].empty() && my_vector[1].empty() && ..){
        //process 3}
...
...

else if (!my_vector[0].empty() && !my_vector[1].empty() && my_vector[2].empty() && ..   
         my_vector[4].empty()){ //process n}
else if (!my_vector[0].empty() && !my_vector[2].empty() && my_vector[1].empty() && ..   
         my_vector[4].empty()){ //process n+1}
....
....
else if (!my_vector[0].empty() && !my_vector[1].empty() && !my_vector[2].empty() &&    
         my_vector[3].empty() && my_vector[4].empty()){ //process p}
....
like wise

这真的很难测试,任何有条不紊的方法都可以做到这一点。 提前致谢。

4

4 回答 4

6

使用来自的count_if模板函数<algorithm>和一个 lambda,您将获得一个紧凑而清晰的解决方案:

unsigned int non_empties = std::count_if(myvector.begin(), myvector.end(), [](const ClassA & c) { 
     return !c.empty();
});

if (non_empties == 1) {
  // process 1
} else if (non_empties == 2) {
  // process 2
} else if (non_empties >= 3) {
  // process 3
}

<algorithm>库令人惊讶地经常被忽视,而它提供了像这样的真正实用的解决方案。

于 2013-06-06T15:31:28.100 回答
1

如果空/非空元素的配对无关紧要,您可以遍历您的集合以计算有多少是空的:

int size = my_vector.size();
int emptyCount = 0;
for (int i = 0; i < size; i++) {
    emptyCount += (my_vector[i].empty() ? 1 : 0);
}

if (emptyCount == 0) {
    // no elements are empty
} else if (emptyCount == 1) {
    // only one element is empty
} else if { emptyCount == 2) {
    // two elements are empty
} ...

最后,使用这种方法,您仍然需要每个条件的 if/else-if;但是,这可以扩展到使用百分比(如果您的集合增长到随机大小)。

于 2013-06-06T15:26:48.510 回答
0

Define an array of patterns (conceptually a 2D array of bool). Then iterate through each row in turn, and find the one that matches. Then call the relevant function corresponding to that row (you'll probably want an array of function pointers).

于 2013-06-06T15:23:58.807 回答
0

也许新的 c++11 函数 all_of、none_of 可以在这里为您提供帮助。

所以你可以做这样的事情

auto iter_begin = my_vector.begin();
auto iter_end = my_vector.end();
auto is_empty = [](decltype(*iter_begin) const & param){ return param.empty();};
auto is_not_empty = [](decltype(*iter_begin) const & param){ return !param.empty();};

if(iter_begin->empty() && all_of(iter_begin + 1, iter_end, is_empty ))

else if(all_of(iter_begin, iter_begin + 1, is_not_empty) && all_of(iter_begin + 2, iter_end, is_empty))

else if(all_of(iter_begin, iter_begin + 2, is_not_empty) && all_of(iter_begin + 3, iter_end, is_empty))

等等

于 2013-06-06T15:27:50.767 回答