检查Vector是否只有相同的元素或-2 C ++

时间:2017-03-02 14:43:41

标签: c++ vector

我有一个看起来像的载体:

{-2, -2, 4, 4, 6}   (Vector is not sorted!)

现在我想创建一个if子句:

如果Vector只包含-2或所有其他元素都相同,则它是一个很好的向量。如果没有那么它就是一个坏的载体

示例:所以{-2,1,1,1,1,-2}可以,1或-2都可以,但{-2,1,2,3,-2}会很糟糕,因为除了-2之外,其他元素都不一样。

所以我用std :: find

尝试了
if (std::find(vector.begin(), vector.end(), !-2 || !max) != subBinNo.end())

但它不起作用。

3 个答案:

答案 0 :(得分:1)

您可以使用std:set解决此问题的一种方法。 set仅包含唯一值,因此如果我们将向量复制到集合中,则只有唯一元素才会出现在集合中。这意味着在您的情况下,如果集合包含-2而另一个元素需要大小为2,否则如果大小为1则该向量仅包含相同的元素。这样做会给我们看起来像

的代码
bool unique_ignore_negative_two(const std::vector<int>& data)
{
    std::set<int> unique{data.begin(), data.end()};
    return (unique.size() == 1) || ( unique.size() == 2 && unique.count(-2) == 1);
}

然后你会像

一样使用它
if (unique_ignore_negative_two(vector_name)
{
    // do true stuff
}
else
{
    // do false stuff
}

答案 1 :(得分:1)

另一种不需要修改原始vector的解决方案是:

bool isVectorSame(std::vector<int> const& vector)
{
    bool result = true;

    const auto firstNot = std::find_if_not(vector.begin(), vector.end(), [](auto i) { return (i == -2); });

    if(firstNot != vector.end())
    {
        result = std::all_of(firstNot, vector.end(), [&](auto i) { return ((i == -2) || (i == (*firstNot))); });
    }

    return result;
}

这个想法如下:

  1. 找到第一个值!= -2 *
  2. 使用std::all_of,检查vector中的每个值是否等于-2或步骤1中找到的值。
  3. 看到它运行here

    *如果找不到!= -2的值,则向量将填充-2并通过测试。

答案 2 :(得分:0)

使用range-v3,您可以:

bool test(const std::vector<int>& v)
{
    auto r = v | ranges::view::filter([](int e) { return e != -2; });
    const auto p = ranges::minmax_element(r);

    return r.end() == p.first || *p.first == *p.second;
}

Demo