-1

这是我第一次使用这个习语,我有一个向量v1,其中元素必须是另一个向量中元素的子集v2。现在,想象v1和作为集合,如果不存在(对于任何有意义的) v2,我想执行v2-v1并抛出异常。v1[i]v2i

我想出了这个:

std::vector<T> v1;
std::vector<T> v2;
//fill v1, v2 somehow
for(size_t i=0; i<v1.size(); i++){
  v2.erase(std::remove(v2.begin(), v2.end(), v1[i]), v2.end());
  if(/*erase option failed because v1[i] doesn't exists in v2*/)
    throw std::runtime_exception (std::to_string(i)+"-th in v1 doesn't exists in v2!");
}

我该如何填写if条件?

4

1 回答 1

8

只需检查是否删除了任何元素:

const auto orig_size = v2.size();
v2.erase(std::remove(v2.begin(), v2.end(), v1[i]), v2.end());
if (v2.size() == orig_size)

或将其拆分(没有什么会迫使您在单个语句中执行删除和擦除):

const auto last = std::remove(v2.begin(), v2.end(), v1[i])
if (last == v2.end())
  throw std::runtime_exception (std::to_string(i)+"-th in v1 doesn't exists in v2!");
v2.erase(last, v2.end());

如果您保持两个向量的排序并使用算法一起遍历它们,您可以使代码更加高效。您当前的代码是 O(n²),因为它会v2v1.

于 2017-05-18T08:46:37.443 回答