搜索对象指针向量

时间:2014-11-21 08:18:51

标签: c++ pointers vector

我有一个Player类,其中Class类型的每个对象都有一个名称,wins,loss和draw。通过调用the_player = new Player(the_name)创建Player类的每个对象。当用户输入新名称以将Player对象添加到程序时,指针被推入向量AllPlayers。程序应该在按下新指针之前检查所述向量中尚未存在所需的播放器。我必须在整个程序中多次检查,所以我想我会为它编写一个函数。这是我的功能:

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 exists\n";
    }
} while (findPlayer(AllPlayers, the_name) != -1);

the_player = new Player(the_name);
AllPlayers.push_back(the_player);

出于某种原因,但是,每当我尝试添加一个新玩家时,它都会抛出“玩家已经存在”并且永远不会离开do-while循环。当AllPlayers向量为空时,这甚至是正确的。我添加了一个cout&lt;&lt; findPlayer(AllPlayers,the_name)用于调试,它打印4192252,我假设它是矢量中可能的最大元素。

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

您认为,如果vals为空,将从findPlayer返回什么?

是否定义了?

答案 2 :(得分:1)

如果向量为空,则根本不进入循环,因此不要达到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;

答案 3 :(得分:0)

查找播放器功能应该是:

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;
};

答案 4 :(得分:0)

按以下方式重写该功能

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。

考虑到标题std::find_if中声明的标准算法<algorithm>可用于代替您的函数。