搜索对象指针的向量

Searching a vector of object pointers

本文关键字:向量 指针 对象 搜索      更新时间:2023-10-16

我有一个玩家类,其中类类型的每个对象都有一个名称,赢,输和平局。 Player 类的每个对象都是通过调用 the_player = new Player(the_name) 创建的。 当用户输入新名称以将 Player 对象添加到程序中时,指针将被推送到矢量 AllPlayer 中。 程序应在推送新指针之前检查所需的播放器是否在所述向量中尚不存在。 我必须在整个程序中多次执行此检查,因此我想我会为它编写一个函数。 这是我的函数:

int findPlayer(vector<Player*> &vals, string name_in)
{
    for (int i = 0; i < vals.size(); i++){
        if (vals[i]->getName() == name_in){
            cout << vals[i]->toString() << endl;
            return i;
        }
        else
            return -1;
    }
};

当请求添加新播放器的选项时,使用以下代码:

do {
    cout << "Name: "; 
    cin >> the_name;
    if (findPlayer(AllPlayers, the_name) != -1){
        cerr << "Player already existsn";
    }
} while (findPlayer(AllPlayers, the_name) != -1);
the_player = new Player(the_name);
AllPlayers.push_back(the_player);

但是,出于某种原因,每次我尝试添加新播放器时,它都会抛出"玩家已经存在"并且永远不会离开do-while循环。 当 AllPlayer 向量为空时也是如此。 我添加了一个 cout <<findPlayer(AllPlayers,the_name) 进行调试,它打印了4192252我认为这是向量中可能的最大元素。

所以问题是:为什么它返回4192252而不是 -1?

如果

vals为空,则永远不会进入for循环,并且函数在没有点击return语句的情况下退出。这意味着你会得到一个随机值,在这种情况下,4192252恰好在返回寄存器中。如果您阅读编译器警告,它们将告诉您这一点。

你怎么想,如果 vals 为空,从 findPlayer 返回什么?

它被定义了吗?

如果向量为空,则根本不进入循环,因此不要到达 return 语句,也不返回有效值。应启用编译器警告以捕获此错误。

否则,您只需检查第一项,并立即返回它是否匹配。如果找到匹配项,则返回,但继续查找,并且仅在没有匹配项时返回 -1:

for (int i = 0; i < vals.size(); i++){
    if (vals[i]->getName() == name_in){
        cout << vals[i]->toString() << endl;
        return i;
    }
}
return -1;

find player 函数应该是这样的:

int findPlayer(vector<Player*> &vals, string name_in)
{
    if(vals.size() == 0)
        return -1;
    for (int i = 0; i < vals.size(); i++){
        if (vals[i]->getName() == name_in){
            cout << vals[i]->toString() << endl;
            return i;
        }
    }
    return -1;
};

按以下方式重写函数

bool findPlayer( const std::vector<Player*> &vals, const std::string &name_in )
{
    std::vector<Player*>::size_tyoe i = 0;
    while ( i < vals.size() && vals[i]->getName() != name_in ) ++i;
    return i != vals.size();
}

考虑到成员函数getName必须使用限定符const定义。

至于你的函数,那么当向量为空时,它不返回任何内容,或者在向量的第一个元素与字符串不一致的情况下返回 -1。

请注意,在标头<algorithm>中声明了标准算法std::find_if可以使用该算法代替函数。