gpt4 book ai didi

c++ - 我应该为一个只是 vector 包装器的类编写迭代器吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:25 25 4
gpt4 key购买 nike

我应该为一个只是 vector 包装器的类编写迭代器吗?

我的类 Record 中唯一的私有(private)成员是 vector 。

我希望能够做到这一点:

for (auto& elem : record) {
// do something with elem
}

其中 record 是 Record 类型。为此,我需要实现迭代器对于记录类。但是,我也可以这样做:

for (auto& elem : record.elems) {
// do something with elem
}

其中 record.elems 是我提到的 vector 。但是这样我需要将其公开。

另一种方法是:

for (auto& elem : record.getElems()) {
// do something with elem
}

这样我就得到了迭代,并且成员保持私有(private)。这可能是最好的方法。

我的主要问题是,为什么我要费心为 Record 类实现迭代器什么时候它只是一个 vector 的包装器?我的同事坚持要我实现迭代器,他甚至无法向我解释原因,这太愚蠢了。

最佳答案

实现迭代器将有助于类的封装。如果在任何时间点,您决定用另一种数据类型替换支持 vector ,则可能会破坏依赖性。

实际上,您不需要实现迭代器。您可以typedef 将您的迭代器作为 vector 迭代器,并创建内联begin()end() 方法以返回 vector 的迭代器。

编辑:根据要求,一个简单的例子:

template <class T>
class vectorWrapper
{
typedef typename std::vector<T> backingType;
backingType v;
public:
typedef typename backingType::iterator iterator;
typedef typename backingType::const_iterator const_iterator;
iterator begin() { return v.begin(); }
const_iterator begin() const { return v.begin(); }
const_iterator cbegin() const { return v.cbegin(); } // C++11
iterator end() { return v.end(); }
const_iterator end() const { return v.end(); }
const_iterator cend() const { return v.cend(); } // C++11
};

如果需要(或想要)reverse_iterator 可以用相同的方式添加。由于这些方法可能会被编译器内联,因此使用它几乎没有开销。

关于c++ - 我应该为一个只是 vector 包装器的类编写迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20681150/

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