返回std ::对自定义容器元素的自定义迭代器(无提升)

时间:2018-02-05 20:52:17

标签: c++

我尽可能简化课程并进行演示。它看起来很简单:

#include <iostream>
#include <vector>


class Simple
{
private:
    std::vector<std::size_t> indices;
    std::vector<int> values;
public:
    void insert(std::size_t index, int value)
    {
        indices.push_back(index);    
        values.push_back(value);
    }
    int at(std::size_t index)
    {
        return values[indices[index]];    
    }
};

int main()
{
    Simple s;
    s.insert(10, 100);
    std::cout << s.at(10) << std::endl;
    return 0;
}

我要实现的是遍历此容器的元素并在每次迭代时获取std :: pair,其first元素将是来自indices成员的值且其{{1} } element将是second成员的值。类似的东西:

values

我对迭代器来说真的很陌生。我知道如何遍历标准容器并获取它们的值。我甚至知道如何遍历我的Simple s; s.insert(10, 100); for (std::pair<std::size_t, int> node : s) { std::cout << node.first << " " << node.second << std::endl; // expect to print 10 100 } 容器并在每次迭代时从Simple成员获取值。我可以这样做:

values

但我不知道如何在每次迭代时创建一些新的数据类型并将其返回给客户端代码。

1 个答案:

答案 0 :(得分:1)

请注意,您尝试迭代一个没有任何抽象类的类。我的意思是,如果你&#34; 使它&#34;你只能迭代它。一个矢量,或者你可以迭代的不同数据结构。

class Simple : public vector<std::pair<std::size_t, int>> { /*...*/ };

使用这种语法声明class后,您就可以将其作为对向量处理。您将拥有声明自己的自定义方法的优势。

您现在可以:

Simple simple;
simple.push_back({10, 100});
for (auto element : simple) {
    std::cout << element.first << " " << element.second << std::endl;
}

我建议你在这种实现中使用reading。有时它可以节省很多工作!你知道他们说了什么,为什么重新发明轮子?

请记住,方法at(10)将返回向量位置 10 的元素。在您的示例中,您试图从out_of_range位置读取。

也许您对map感兴趣,其中包含keyvalue。从您的示例来看,您似乎并未尝试对数据结构进行排序。如果是,您可以使用map代替unordered_map。您可以使用find方法从密钥中检索值:

#include <unordered_map>

/* ... */

unordered_map<std::size_t, int> simple;    
simple.insert({10, 100});

auto it = simple.find(10);
if (it != simple.end()) {
    std::cout << "Found value from key: " << *it << std::endl;
} else {
    std::cout << "Your map doesn't contain such key!" << std::endl;
}

请注意,map不允许多个键具有相同的值。但multimap确实如此。