0

我在没有找到任何解决方案的代码中遇到问题。

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

board_ 是 Buffer 的成员变量,它的类型为 std::map< PlayBoard, InvVertex* >。

这部分代码的程序输出为:

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

4

1 回答 1

4

我们的信息很少,但我唯一能猜到的是这PlayBoard::operator <()不是严格的弱排序,在这种情况下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
于 2013-08-06T16:27:28.813 回答