gpt4 book ai didi

用于深度嵌套私有(private)数据的 C++/STL 公共(public)迭代器

转载 作者:行者123 更新时间:2023-11-30 03:35:17 25 4
gpt4 key购买 nike

考虑以下具有深度嵌套私有(private)数据的类定义。

template <typename T, typename U, typename V>
class NestedData {
private:
typedef std::vector<V> L3;
typedef std::map<U, L3> L2;
typedef std::map<T, L2> L1;
L1 inner_data;
};

假设我们希望添加一个公共(public)接口(interface)来迭代三个级别中的每一个。也就是说,我们希望允许客户端构建三个嵌套循环,迭代每个类型 V 的值,知道类型 U 和 T 的关联值。我们可以添加以下方法:

L1::const_iterator begin() const { return inner_data.begin(); }
L1::const_iterator end() const { return inner_data.end(); }

在这种情况下,迭代器的结果将是成对的,右侧引用类型 L2。尽管引用是 const,但它公开了 std::map 类型的完整 API,这对于公共(public)接口(interface)来说是不可取的。一个更简洁的解决方案将只提供一个包装器,使迭代 L2 成为可能。然而,我还没有看到任何标准的 STL 容器封装的习惯用法,即使是最好的情况,解决方案的实现似乎也会造成代码的高度膨胀。

这个问题的通用解决方案是什么,它能很好地适应一般的 C++ 约定?

最佳答案

只需通过 const getter 公开 map 本身。公开迭代器仍然会将您的用户绑定(bind)到底层数据类型,但它会削弱他们的能力 - 例如,他们不能在其上使用 find - 所以这是一个没有任何好处的缺点。

如果您可以重新设计您的类,使内部映射完全成为一个实现细节,并且客户永远不需要看到它 - 那么您将删除迭代器和 setter ,并公开一些有意义的函数。

关于用于深度嵌套私有(private)数据的 C++/STL 公共(public)迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41386818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com