std::map 查找无法正常工作

发布于 2024-08-13 14:31:03 字数 1093 浏览 3 评论 0原文

std::map.find() 的目的是,如果有的话,将 map::iterator 返回到它找到的元素,如果没有,则返回到 end() 。我得到 BadPtr 返回给我。完全相同的构造在代码的其他部分中运行良好。这是什么?

class OntologyContainer {
    map<string, OntologyClass*> data;
    OntologyClass* last_added;
public:
    class iterator : public std::iterator<bidirectional_iterator_tag, OntologyClass> {
        map<string, OntologyClass*>::iterator itr;
    public:
        iterator(map<string, OntologyClass*>::iterator it) : itr(it) { }

    ...
    }

    iterator begin() {
        return iterator(data.begin());
    }

    iterator end() {
        return iterator(data.end());
    }

    iterator Find(const string & to_find) {
        map<string, OntologyClass*>::iterator it = data.find(to_find);
        // this is where it fails
        return iterator(it);
    }

map::iterator 被包装是为了使运算符 * 和 ->分别返回OntologyClass对象和指针:

            OntologyClass& operator* () {
        return *(itr->second);
    }

    OntologyClass* operator->() {
        return itr->second;
    }

std::map.find() is intended to return an map::iterator to an element it found if there is some or to the end() if not. I get BadPtr returned to me. The exactly same construct works fine in the other part of code. What is this?

class OntologyContainer {
    map<string, OntologyClass*> data;
    OntologyClass* last_added;
public:
    class iterator : public std::iterator<bidirectional_iterator_tag, OntologyClass> {
        map<string, OntologyClass*>::iterator itr;
    public:
        iterator(map<string, OntologyClass*>::iterator it) : itr(it) { }

    ...
    }

    iterator begin() {
        return iterator(data.begin());
    }

    iterator end() {
        return iterator(data.end());
    }

    iterator Find(const string & to_find) {
        map<string, OntologyClass*>::iterator it = data.find(to_find);
        // this is where it fails
        return iterator(it);
    }

map::iterator is wrapped for the sake of making operators * and -> returning OntologyClass objects and pointers respectively:

            OntologyClass& operator* () {
        return *(itr->second);
    }

    OntologyClass* operator->() {
        return itr->second;
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

温柔嚣张 2024-08-20 14:31:03

这可能与您继承自 std::iterator 的事实有关,使您的迭代器 value_type 为 OntologyClass,而不是 指向OntologyClass的指针,这是您的地图迭代器使用的。您如何实现解引用运算符?

It might be something to do with the fact that you inherit from std::iterator<bidirectional_iterator_tag, OntologyClass>, making your iterator value_type to be OntologyClass, rather than a pointer to OntologyClass, which is what your map iterator uses. How are you implementing the dereference operator?

奈何桥上唱咆哮 2024-08-20 14:31:03

如果你可以使用 boost 我建议使用 boost::transform_iterator 。

这个堆栈溢出答案有一个很好的例子来说明如何做到这一点:
迭代器适配器仅迭代映射中的值?< /a>

if you can use boost I suggest using boost::transform_iterator.

This stack overflow answer has a decent example on how to do that:
iterator adapter to iterate just the values in a map?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文