gpt4 book ai didi

c++ - 无法创建以 vector 为键和自定义类为值的 map

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:48:59 26 4
gpt4 key购买 nike

我创建了下面的抽象类来评估简单游戏的棋盘位置。抽象类被每个派生类覆盖,所以在game.h中只定义了评估函数

我试图通过使用内存来提高我的程序的效率,但我无法让我的 map 正常工作。编译器对行 results[ board ] = best 抛出错误。此行试图将映射到当前棋盘(整数 vector )的值设置为从该位置开始的最佳可能移动。 Move 是我创建的一个类,它只包含一个分数、一个要删除以制作下一个板的数字,以及要从中删除数字的索引(堆)。

“results[board] = best”的编译器错误表示没有匹配的函数调用 move::move()。我不明白这个错误,因为我不是要创建新的着法,只是存储当前的最佳着法。我已经尝试创建一个临时移动并存储它,所以我知道这是不正确的。

最后一点 - 没有该行代码,代码可以完美编译和运行,所以我知道算法和所有子类都可以正常工作。任何帮助,将不胜感激!

// VIRTUAL FUNCS
// All virtual functions must be overridden by subclasses

virtual ~game(){ }

// initialize
virtual void initialize( int numPlayers, std::vector<int> board ) = 0;


// gameHasEnded
virtual bool gameHasEnded( std::vector<int> board ) const = 0;

// display
virtual void display( std::vector<int> board ) const = 0;

// makeNewBoard
virtual std::vector<int> makeNewBoard( std::vector<int> currBoard, move m ) = 0;

// generateMoves
virtual std::vector< move > generateMoves( std::vector<int> currBoard ) = 0;

// compare
virtual move compare( std::vector<int> board1, std::vector<int> board2 ) = 0;

// NON-VIRTUAL FUNCS

//
// Name: evaluate
// Description: Evaluates a given board position. Determines whether
// or not the current position is a winning position
// or a losing position. A winning position is
// designated by a 1, a losing by a -1.
// Modifies: The board and the score.
// Returns: The best possible move from this position.
//
move evaluate( std::vector<int> board, int multiplier = 1, int currScore = -100) {

// Base case is defined by subclasses
if( gameHasEnded( board ) ) {
move toReturn(multiplier, 0);
return toReturn;
} // end-if

// If game is not over
else {

std::map<std::vector<int>,move>::iterator iter = results.find( board );
if( iter != results.end() ) {
return iter->second;
}
else {

move best(-2,0); // Just a place holder. Is overridden later.
int s = 0; // Stores the score

std::vector<move> nextMove;
// generate all possible boards from this position - defined by subclass
nextMove = generateMoves( board );

// For each board position
for( int i = 0; i < ( (int)nextMove.size() ); ++i ) {
std::vector<int> newBoard;

// Create a new possible board state
newBoard = makeNewBoard( board, nextMove[i] );

move dif = compare( board, newBoard ); // Get the move that was made
move m(0,0); // place holder
m = evaluate( newBoard, multiplier*-1, currScore ); // recurse through all positions
s += m.getScore();
// If this is the best score so far
if( m.getScore() > currScore ) {

m.setNumTake( dif.getNumTake() ); // get the move
m.setPile( dif.getPile() );
best = m; // store the move
currScore = m.getScore(); // update the score

}

}
best.setScore( s );

////////////////////////////// THIS IS THE LINE THAT THROWS A COMPILER ERROR

results[ board ] = best;

//////////////////////////////////

return best; // return best move
}
}
return move(2,2); // dummy return. should never happen
}

private://数据成员

std::map<std::vector<int>,move> results;

};

最佳答案

您在具有 [] 运算符的映射中用作值的任何类都必须能够使用默认构造函数创建。

results[ board ] = best;

会做以下事情

  1. 使用 board 键创建一个default move()
  2. 返回对该地址的引用
  3. 通过分配 best 来覆盖默认着法。

您未通过第 1 步。

关于c++ - 无法创建以 vector 为键和自定义类为值的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3955547/

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