检查项目是否已在向量中

时间:2014-01-16 16:51:02

标签: c++ vector shared-ptr

所以我想对类中的向量进行一些错误检查,以便在将新项添加到向量之前查看该项是否已存在。

ClassA cpp

void ClassA::func(std::shared_ptr<ClassB> new_item)
{
    for(auto items : vector_)
    {
        if(items = new_item)
        {
            return;
        }
        vector_.push_back(new_item);
    }
}

vector_是成员类成员std :: vector。使用此当前实现,所有new_item都被忽略,即使它不是重复的。我知道'if(items = new_item)'是有问题的一行,但我不知道为什么。

5 个答案:

答案 0 :(得分:6)

您要分配而不是在此处比较相等:

if(items = new_item) // assigns value of new_item to items

使用经过良好测试的标准库函数(例如std::find

)可以轻松避免此类问题
#include <algorithm> // for std::find
....
if (find(vector_.begin(), vector_.end(), newitem) == vector_.end())
  vector_.push_back(newitem);

答案 1 :(得分:2)

你有一个错字:

if(items = new_item)

应该是

if (items == new_item)
是的,你可以写

if (std::find(std::begin(vector_), std::end(vector_), new_item) == std::end(vector_) {
    vector_.push_back(new_item);
}

或使用std::set

答案 2 :(得分:1)

=是作业

==是平等

你想要

    if(items == new_item)
    {
        return;
    }

答案 3 :(得分:1)

这就是你需要的:

void ClassA::func(std::shared_ptr<ClassB> new_item)
{
    for(auto items : vector_)
    {
        if(items == new_item)
        {
            return;
        }            
    }

    vector_.push_back(new_item);
}

请注意,您需要==而不是=。此外,您的代码在每次迭代时都向向量添加new_item。现在,如果找不到该项目,它就完成了。

答案 4 :(得分:1)

您正在使用

 if(items = new_item)
    {
        return;
    }

new_item的值被分配给项目,因为“=”是一个赋值运算符,任何正数的if都将使条件成立。您需要使用“==”运算符进行比较