我在Map中有9个元素,但begin()和end()之间的距离只有2

时间:2013-08-06 15:38:04

标签: c++ map iterator

我在代码中遇到问题,我找不到任何解决方案。

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

1 个答案:

答案 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