【问题标题】:Create iterator for class using map使用 map 为类创建迭代器
【发布时间】:2019-05-30 14:50:27
【问题描述】:

我正在使用map 实现一个类,如下所示:

class Letras {
    typedef std::pair<int, int> p_c;
    std::map<char, p_c> bolsa;
public:
    ...
};

我想实现一个迭代器的功能,像这样使用:

Letras l;

Letras::iterator it;
for ( it = l.begin(); it != l.end(); ++it )
    cout << *it << endl;

这样它就可以从std::map 第一个组件(键)中打印出chars。

提前致谢。

更多关于Letras的信息

Letras 是一个实现类似 Scrubble 的字母集的类,map 用于表示一组letras(西班牙语中的letters),如以下:

{{letter_1, {quantity_1, score_1}}, {letter_2, {quantity_2, score_2}}, ..., {letter_n, {quantity_n, score_n}}}

其中letter_i 是集合中的某个字母,quantity_i 是该字母在集合中的次数(类似 Scrubble 的字母集合可以有各种相同的字母),score_i 是字母分数.

我使用了地图,因为一个字母只能有一个关联的分数,所以在这个类中,i != j =&gt; letter_i != letter_j

Letras 的用途是从 Diccionario 类(dictionary)中找到由某个字母集组成的最佳单词,该类实现了 DAWG 结构以实现快速搜索和查找。

【问题讨论】:

  • 你还没有问过问题。
  • @KerrekSB 我正在寻求实现这一点的提示,我已经能够为其他类正确实现迭代器,但对于使用 STL 的类则不行
  • 看起来这里需要一种“转换迭代器”。 (Boost有这样的东西。)
  • @mianfg 当*l 被调用时你想返回什么?不应该是*it吗?
  • @KunalPuri 非常抱歉打错字了,当然是*it 而不是*l

标签: c++


【解决方案1】:

你可以这样做:

#include <iostream>
#include <map>
#include <algorithm>

using namespace std;

class Letras {
private:
    typedef std::pair<int, int> p_c;
    std::map<char, p_c> bolsa;

public:
    class iterator {
    private:
        std::map<char, p_c>::iterator it;

    public:
        iterator(const std::map<char, p_c>::iterator &it) {
            this->it = it;
        }

        // EDIT: Removing Copy Semantics
        iterator(const iterator &it) = delete;
        iterator &operator =(const iterator &it) = delete;

        // EDIT: Enabling Move Semantics
        iterator(iterator &&it) = default;
        iterator &operator =(iterator &&it) = default;

        auto &operator *() const {
            return it->first;
        }

        iterator &operator ++(int) {
            this->it++;
            return *this;
        }

        bool operator !=(const iterator &it) {
            return this->it != it.it;
        }
    };

    auto begin() {
        return iterator(bolsa.begin());
    }

    auto end() {
        return iterator(bolsa.end());
    }

    void insert(const std::pair<char, p_c> &p) {
        bolsa.insert(p);
    }
};

int main() {
    Letras b;
    b.insert(make_pair('f', make_pair(1, 2)));
    b.insert(make_pair('g', make_pair(1, 2)));
    b.insert(make_pair('h', make_pair(1, 2)));

    for (auto it = b.begin(); it != b.end(); it++) {
        cout << *it << endl;
    }

    return 0;
}

【讨论】:

  • 非常感谢!但是,我还需要实现默认构造函数才能声明Letras::iterator it——我将其设置为NULL:iterator() : it(0) {},它工作正常!
  • 一个问题,你为什么将operator++声明为iterator&amp; operator++(int)int 是做什么的?
  • @mianfg 我认为iterator() : it(0) {} 不是推荐的做法。见stackoverflow.com/questions/27817732/…
  • @mianfg 对于运营商 ++ 信息,请参阅:stackoverflow.com/questions/7740350/…
  • @mianfg 顺便问一下为什么需要默认构造函数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 2012-01-10
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多