c++ - 在 C++ 中将迭代器存储为类成员的最佳实践

标签 c++ oop iterator

考虑到要迭代的序列或数据结构未知,是否存在将迭代器存储为类成员的最佳实践?我编写了一些代码来说明我想要实现的目标,但代码无法编译。

#include <iterator>

class entity {
    std::iterator<std::forward_iterator_tag, double>
        &it_begin_, &it_end_;
public:
    template <typename iter_type>
    entity(iter_type first, iter_type last) 
    : it_begin_(first)
    , it_end_(last) { } 

    // ... other implementation details
};

// example usage
int main() {
    std::vector<double> my_vec {1.0, 2.0, 6.0, 8.0, 2.0};
    entity my_entity(std::begin(my_vec), std::end(my_vec));
    // do stuff with entity
    return 0;
}

编辑:

只是为了添加一些上下文,我正在尝试按照 suggestion 的方式实现一些内容我在 CodeReview 网站上收到了。

编辑2:

我收到了一些有用的答案。请原谅我没有提及这个细节,但我认为从代码中可以清楚地看出:我想指定(作为实现细节的一部分)我想要一个前向迭代器,并且取消引用它会返回一个 double.

最佳答案

几件事:

  1. std::begin(my_vec) 返回一个迭代器,但实体类在其上存储引用。如果您想以这种方式使用它,请删除引用 &

  2. 存储迭代器没有问题,但迭代器始终与容器类型相关,例如vector::iterator。或者您可以模板化您的类:


template < class iterator > 
class entity
{
  iterator _it, _end;
public:
  entity(iterator begin, iterator end): _it(begin), _end(end){}
  /* ... */
};

int main() {
  std::vector<double> my_vec {1.0, 2.0, 6.0, 8.0, 2.0};
  entity my_entity(my_vec.begin(), my_vec.end());
  // do stuff with entity
  return 0;
}

关于c++ - 在 C++ 中将迭代器存储为类成员的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29201194/

相关文章:

c++ - 使用 shared_ptrs 的 pair<unsigned int, boost::any> 类型的通用容器的线程安全实现

java - 当我想在 Java 的类方法中使用类字段时,定义最终局部变量是一种好习惯吗?

oop - 接口(interface)方法调用错误: method is unknown or PROTECTED or PRIVATE

c++ - 设置迭代器在 `it-1` 上出错

c++ - STL 算法和 const_iterators

c++ - QT 从文件和文件夹列表中选择多项

C++得到指针而不是值

c++ - libcurl 错误,curl_easy_perform() 失败 : c++

java - 一个对象引用一个类 A 的对象,而另一个类 B 的对象作为其实例变量,是否也指向类型 B 的对象?

c++ - 我可以将 std::begin 和 std::end 专门化为 equal_range() 的返回值吗?