gpt4 book ai didi

c++ - 基于对象指针在 vector 中获取对象

转载 作者:行者123 更新时间:2023-11-30 02:46:43 24 4
gpt4 key购买 nike

我正在尝试遍历 Player 对象的 vector ,然后根据 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 *'

感谢您的帮助。

最佳答案

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

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

关于c++ - 基于对象指针在 vector 中获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23344488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com