如何在对象矢量中找到特定值

时间:2016-01-31 23:46:14

标签: c++ vector

我有一个类Weapon的向量,然后循环并将id值添加到向量。

Weapon* weapon;
vector<Weapon*> weaponVector;

for (int i = 0; i < 10; i++)
{
    weapon = new Weapon(i);
    weaponVector.push_back(weapon);
}

然后我有一个向量迭代器来尝试在向量中找到指定的数字。

vector<Weapon*>::iterator findIt;
findIt = find(weaponVector.begin(), weaponVector.end(), 5);

在Weapon类中,我创建了一个运算符重载来检查id是否相同。

bool Weapon::operator==(const Weapon& rhs)
{
    return (rhs.id == id);
}

Quesion:

我试图在weaponVector中找到数字5,但是我一直收到这个错误:

C2446 '==': no conversion from 'const int' to 'Weapon *

我尝试过的事情:

findIt = find(weaponVector.begin(), weaponVector.end(), Weapon(5));

Weapon five = Weapon(5);
findIt = find(weaponVector.begin(), weaponVector.end(), five);

无论我尝试什么,我都会遇到错误。非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

如果使用C ++ 11,只需使用带有lambda函数的std::find_if

#include <algorithm>
//...
int number_to_find = 5;
auto findIt = std::find_if(weaponVector.begin(), weaponVector.end(), 
                          [&](Weapon* ptr) { return ptr->id == number_to_find;});

答案 1 :(得分:1)

尝试使用std::find_if功能。然后,您可以传递一个可以在Weapon和ID号之间进行比较的函数。请参阅http://en.cppreference.com/w/cpp/algorithm/find

答案 2 :(得分:0)

当你的搜索正在搜索整数5(a Weapon*)时,你的Vector会持有指向武器(const int)的指针。比较两者都没有意义,因为你不想知道是否有任何武器对象存储在内存地址“5”。

Weapon*与实际Weapon进行比较也没有多大意义,因为对象及其内存地址不同。

因此,您使用std::find_if或使用std::vector<Weapon>并直接存储武器对象。

答案 3 :(得分:0)

您可能希望在向量中使用武器副本而不是指针:

std::vector<Weapon> weaponVector;
for (int i = 0; i < 10; i++)
{
    Weapon w = Weapon(i); // Create a temporary weapon.
    weaponVector.push_back(weapon);  // Copy the temporary and place into the vector.
}

通过使用副本,您可以消除动态内存管理的麻烦,并且还必须取消引用指针。

您的搜索循环:

vector<Weapon>::iterator findIt;
Weapon w5 = Weapon(5);
findIt = find(weaponVector.begin(), weaponVector.end(), w5);

请注意,我创建了一个临时文件,因为您没有在班级中定义operator==(unsigned int)(或者您没有显示它)。 find函数希望搜索值与向量中的对象具有相同的类型。