【问题标题】:How to "refer" to the object who called the iterator如何“引用”调用迭代器的对象
【发布时间】:2016-04-18 12:48:29
【问题描述】:

我有一个 myTest 类,它实现了一个包含一组元素的数组和另一个包含元素出现次数的数组。 示例:如果用户插入此输入:{2,5,76,76},我已经实例化了array[]= {2,5,76}, occurrences[]= {1,1,2}.

然后我有一个随机访问迭代器,现在当我用迭代器打印出我的数组时,我得到了这个控制台输出"2,5,76",它在控制台中写入了我的数组的所有元素,我怎样才能获得一个打印输出的迭代器我的数组计算出现次数?我想要这样的打印输出:"2,5,76,76",那么我应该在哪里修改我的迭代器以获得我想要的?

【问题讨论】:

  • 你能给出一些你在做什么的示例代码吗?我已经将用户输入存储在向量中,只需对其进行迭代即可获得预期的输出。
  • @MoksudAhmed 请在您的问题中提供邮政编码!
  • @MoksudAhmed:请先翻译一下 - StackOverflow 是英文的。
  • @MoksudAhmed 并在此处发布之前将您的代码缩减为 minimal reproducible example。

标签: c++ const-iterator


【解决方案1】:

你的意思是你想要:

vector<int> elements;
vector<int> times;

for (int i=0; i<input.size(); i++) {
    const int idx =  std::find(elements.begin(), elements.end(), input[i]) - elements.begin(); // you asked about this line?
    if (idx >= 0 && idx < times.size())
        ++times[idx];
    else {
        elements.push_back(input[i]);
        times.push_back(1);
    }
}

【讨论】:

  • std::find 返回:迭代到第一个满足条件的元素,如果没有找到这样的元素,则返回最后一个。你为什么不这样使用它? en.cppreference.com/w/cpp/algorithm/find
  • 我需要迭代器来自动打印所有分别出现的元素。
【解决方案2】:

如果你不关心原始数组中元素的顺序,最好切换到std::map或std::unordered_map,并使用元素作为键,元素计为vals:Perl语法中的{2 =&gt; 1, 5 =&gt; 1, 76 =&gt; 2} . 或者,定义您自己的 Iterator 类:

template<typename T> struct DoubleArrayIterator {
    DoubleArrayIterator(T *jimmy, T *billy): jimmy(jimmy), billy(billy) {}
    DoubleArrayIterator &operator++() { ++jimmy, ++billy; return *this; }
    std::pair<T, T> operator*() const { return std::make_pair(*jimmy, *billy); }
    static DoubleArrayIterator begin(T *jimmy, T *billy) { return DoubleArrayIterator(jimmy, billy); }
    template<size_t N> static DoubleArrayIterator end(T (&jimmy)[N], T(&billy)[N]) { return DoubleArrayIterator(jimmy + N, billy + N); }
    bool operator==(DoubleArrayIterator const &that) { return jimmy == that.jimmy && billy == that.billy; }
private:
    T *jimmy, *billy;
};

或者简单地使用索引而不是迭代器。

【讨论】:

    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2019-12-03
    相关资源
    最近更新 更多