我在代码中遇到问题,我找不到任何解决方案。
void Buffer::printAllBoards()
{
std::cout << "Total " << boards_.size() << " boards." << std::endl;
std::map<PlayBoard, InvVertex*>::iterator itr;
for (itr = boards_.begin(); itr != boards_.end(); ++itr)
{
std::cout << "the distance is " << distance(boards_.begin(), boards_.end()) << std::endl;
//PlayBoard board = itr->first;
//board.printBoard();
}
}
boards_是Buffer的成员变量,它的类型为std :: map&lt; PlayBoard,InvVertex *&gt;。
这部分代码的程序输出是:
Total 9 boards.
the distance is 2
the distance is 2
第一行显而易见,因为我向地图添加了9个元素。但是使用迭代器我只能访问其中的两个,因为begin或end函数没有正确的值。
有人有解决方案吗?
感谢您的回答。
我在tar.gz中提供了下载代码: http://www.file-upload.net/download-7931142/invers.tar.gz.html
答案 0 :(得分:3)
我们的信息非常少,但我唯一的猜测是PlayBoard::operator <()
不是strict weak ordering,在这种情况下std::map
有未定义的行为。
例如,下面的代码再现了类似的问题。请注意foo::operator <()
完全搞砸了,这就是问题的原因:
#include <map>
#include <iostream>
struct foo {
foo(int i) : i{i} {}
bool operator <(foo other) const {
return (i != 0 || other.i != 1) && (i != 3 || other.i != 0);
}
int i;
};
int main() {
std::map<foo, int> m{{0, 0}, {1, 1}, {2, 2}, {3, 3}};
std::cout << "size = " << m.size() << '\n' <<
"distance = " << std::distance(m.begin(), m.end()) << '\n';
}
输出(使用GCC 4.8.1):
size = 4
distance = 3