【问题标题】:Getting object within vector based on object pointer基于对象指针在向量中获取对象
【发布时间】:2014-04-28 15:00:57
【问题描述】:

我正在尝试遍历 Player 对象的向量,然后根据 Player 指针返回下一个。我尝试了各种方法来让 lambda 中的运算符匹配,但无法让它工作,并且在堆栈溢出时阅读了类似的此类问题。很抱歉没有发SSCCE,我只是不知道我目前的技能水平如何。

c_player的来源:
定义为:

Player* current_player;

设置为:

void Game::set_first_player_turn(){
    current_player = &game_players.back();
}

错误代码:

using namespace std;
vector<Player>game_players;

Player* Game::find_player(Player* c_player){
    vector<Player>::iterator iter;
    iter = find_if(game_players.begin(), game_players.end(),
                   [&](Player* p ) -> bool{ return p == c_player; }); //This line
                                        // causes the exception. Sets iterator to
                                        // position of the current player
    if (iter != game_players.end()){
        advance(iter, 1);
    }
    else{
        iter == game_players.begin();
    }
    current_player = &(*iter);  

    return current_player;
}

编译错误:

error C2664: 'bool Game::set_game_flow::<lambda_360ac8a355100cfac1adc9f8eba8d8b9>
::operator ()(Player *) const' : cannot convert parameter 1 from 'Player' 
to 'Player *'

感谢您的帮助。

【问题讨论】:

    标签: c++ pointers object vector stl


    【解决方案1】:

    find_if 中的谓词必须对存储在容器中的类型进行 const 引用。您将 Player 类型存储在向量中

    vector<Player> game_players;
    

    这样

    [&](Player* p )
    

    不是正确的谓词。这应该是

    [c_player]( const Player& p ) { return p == *c_player; } 
                                        // ^^^^^^^^^^^^^^
                                        // to compare by value
    // note: to compare by value 
    // bool operator==( const Player&, const Player&)
    // must be defined
    
    [c_player]( const Player& p ) { return &p == c_player; } 
                                        // ^^^^^^^^^^^^^^
                                        // to compare by address
    // note: address of c_player
    // has to be valid (not invalidated by vector through resizing, erasing, etc)
    

    所以你可以写:

    vector<Player>::iterator iter;
    iter = find_if( game_players.begin(), game_players.end(),
                           [c_player]( const Player& p ) { return p == *c_player;});
    

    【讨论】:

    • 使用iter = find_if(game_players.begin(), game_players.end(),[](const Player&amp; p ) { return p == *c_player; }); 我得到错误:C3493: 'c_player' cannot be implicitly captured because no default capture mode has been specified
    • 你必须在[]中捕获一个c_player
    • 这给了:error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const Player' (or there is no acceptable conversion) 感谢您到目前为止的帮助!
    • 您是要比较地址还是比较值?在第二种情况下,您需要定义 bool operator==( const Player&, const Player&)
    • 我实际上不确定哪一个适合我的需要。 c_player 最初是从game_players 获得的。我只需要它在向量中“找到”它,以便if (iter != game_players.end()){advance(iter, 1);} 起作用。因此,如果比较地址或值比较是要走的路,我不介意。我只是在寻找那个功能。在这方面,如果我以错误的方式处理它,请随时告诉我我做错了什么。
    猜你喜欢
    • 2021-05-20
    • 2013-02-03
    • 2011-12-19
    • 2011-10-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多