Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该为仅仅是向量包装器的类编写迭代器吗?_C++_C++11 - Fatal编程技术网

C++ 我应该为仅仅是向量包装器的类编写迭代器吗?

C++ 我应该为仅仅是向量包装器的类编写迭代器吗?,c++,c++11,C++,C++11,我应该为仅仅是向量包装器的类编写迭代器吗 我的类中唯一一个名为Record的私有成员是vector 我希望能够做到这一点: for (auto& elem : record) { // do something with elem } for (auto& elem : record.elems) { // do something with elem } 其中记录类型为记录。为此,我需要实现迭代器 为了唱片班。但是,我也可以这样做: for (auto&am

我应该为仅仅是向量包装器的类编写迭代器吗

我的类中唯一一个名为Record的私有成员是vector

我希望能够做到这一点:

for (auto& elem : record) {
    // do something with elem
}
for (auto& elem : record.elems) {
    // do something with elem
}
其中记录类型为记录。为此,我需要实现迭代器 为了唱片班。但是,我也可以这样做:

for (auto& elem : record) {
    // do something with elem
}
for (auto& elem : record.elems) {
    // do something with elem
}
其中record.elems是我提到的向量。但是这样 我需要把它公之于众

另一种方法是:

for (auto& elem : record.getElems()) {
    // do something with elem
}
这样我得到迭代,成员保持私有。 也许这是最好的办法

我的主要问题是,我为什么要费心为Record类实现迭代器 当它只是向量的包装器时?我的同事坚持我实现迭代器,
他甚至不能解释为什么,这很愚蠢。

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

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

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

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
};
模板
类向量包装器
{
typedef typename std::vector backingType;
背向v型;
公众:
typedef typename backingType::迭代器迭代器;
typedef typename backingType::const_迭代器const_迭代器;
迭代器begin(){返回v.begin();}
常量迭代器begin()常量{返回v.begin();}
常量迭代器cbegin()常量{return v.cbegin();}//C++11
迭代器end(){return v.end();}
常量迭代器end()常量{return v.end();}
const_迭代器cend()const{return v.cend();}//C++11
};

如果需要(或需要)
reverse\u迭代器
s可以以相同的方式添加。由于方法很可能由编译器内联,因此使用该方法几乎没有开销。

如果类应该看起来是一个范围,最好通过
begin()
end()
成员提供对迭代器的访问。关键的优点是类的对象可以与其他范围一致使用:对于类的用途没有太多疑问,而且工作量很小:除非您不希望使用您的类,否则您应该使其易于使用。当然,如果你不希望你的类被使用,那么为什么要在第一时间写它呢


这些是否需要具有与向量不同的类型取决于是否需要施加任何约束。如果类没有对元素或元素的顺序施加约束,那么传递迭代器就足够了。否则,可能需要创建自定义迭代器。

如果我没有弄错的话,您只需要实现
being()
end()
。返回底层向量迭代器应该是可行的……我还要说,这部分取决于这些循环中的内容。如果您可以将它们保存在Record类中,并公开在整个集合上运行的函数,这可能是一种替代方法。好吧,但我的重点是为什么要麻烦呢?向量和迭代机制已经存在了。@user311311311,告诉我们重点是什么。你似乎在试图解决一个问题,但你问了我们你想要的解决方案。我的主要问题是为什么你的类只有一个成员我们永远不会改变向量,它将始终保持向量。问题就这么简单,根本不可能改变。所以是的,向量将永远留在那里。所以这里争论的焦点是是否应该可以迭代
记录
本身,或者是否应该公开一个向量来迭代。你的同事说前者,你说后者。因为这里没有人知道这门课的目的,所以我们不能打那个电话。一般来说,差别很小,但这取决于从外部用户的POV来看,
记录是“一个元素范围”,还是仅仅“提供对”一个元素范围的访问。您的组织可能有一些资历的概念来决定同事们在所有争论结束后无法达成一致的事项。@user1781290您能提供更多关于如何定义迭代器以及begin和end方法应该做什么的详细信息吗?也许在这里写一个简短的示例,这对将来的其他人会有用吗?@user311311311添加了一个小的example@user1781290第三种形式
cbegin()
您忘记了c<代码>返回cbegin()