我有下面的类MyClass
,它包含一个2DMap(std::map<std::string, std::map<std::string,double>>
)。
我想知道是否有可能为MyClass
实现MyClass::begin()
MyClass::end()
函数,以便有一个基于范围的for循环(如下面的代码所示),允许我打印该2D map中包含的所有双精度值。
需要说明的是,我不想引入双for循环,我希望使用单for()循环
(The目标是将Mapmap
作为MyClass
的私有成员,并且只允许通过基于范围的for循环在类上循环)
提前感谢!
class MyClass {
public:
MyClass(){};
~MyClass(){};
std::map<std::string, std::map<std::string,double>> map = {};
};
int main()
{
MyClass myClass;
myClass.map["a"]["a"] = 1;
// ...
myClass.map["e"]["c"] = 12;
for (std::pair<const std::string, double> &obj : mycls){
std::cout << "obj.second = " << obj.second << std::endl;
}
return 0;
}
1条答案
按热度按时间xqkwcwgp1#
是的,可以做到。你必须引入迭代器的功能。
如果你看一下CPP参考here,那么你可以在解释中看到基于范围的for循环的要求,只需要5个函数。
begin()
函数end()
函数定制迭代器的实现非常简单。
你写了5个using语句来满足形式上的需求。然后,你需要定义迭代器的内部表示,例如指针或其他迭代器。
在下面的例子中,我们重用了嵌套Map中的两个迭代器。一个迭代器指向外部Map,一个迭代器指向内部Map。为了更容易地实现功能,我们还将存储一个指向周围定制类的指针。
递增(和递减操作)需要更多的工作,因为我们需要处理内部Map迭代器的回绕。
例:如果内部迭代器到达了末尾,我们必须递增外部迭代器,然后将内部迭代器重置到开始位置。
我还提出了一个面临类似挑战的递减函数。
通过添加一个差分函数,我使整个过程变得更可排序,通过破坏字符串和双精度变量的关系,所以,不要这样做。
但是有了这个函数,我们可以很容易地实现类似太空船的迭代器比较。
请参阅下面的许多可能的解决方案之一。我添加了一些更多的功能,为您提供方便。