【问题标题】:How is it possible to satisfy the new iterator concepts, like RandomAccessIterator?如何满足新的迭代器概念,如 RandomAccessIterator?
【发布时间】:2021-12-26 09:44:58
【问题描述】:

我想通过在std::vector 之上构建来设计一个自定义容器。我没有扩展它,而是决定使用组合,并为我的班级创建一个私有的 std::vector 成员。

我也想实现迭代器。这种方式怎么可能满足RandomAccessIterator的要求呢?我能够找到LegacyContiguousIterator,但也许我应该避免它,因为它是遗留问题。

【问题讨论】:

  • 你应该使用en.cppreference.com/w/cpp/iterator/random_access_iterator而不是TS中的版本
  • 检查std::random_access_iterator需要的操作,并一一实现。
  • 有两组迭代器概念。 Legacy...Iterator(英文描述)和std::..._iteraator(实际C++20 concepts)。为了安全起见,您应该同时遵循两者。
  • @IterAtor - 如果你使用std::vector 作为存储,你已经有std::vector::iterator 迭代存储。所以第一次尝试是重用那个迭代器,这行不通吗?
  • @IterAtor 您需要决定是保留旧接口(例如,通过提供支持旧接口的迭代器并将使用该接口的每个操作映射到底层向量的迭代器)还是实现符合标准概念。第一个不需要实现符合标准要求的迭代器。如果您没有支持旧接口的特定要求,那么您可以直接使用向量的迭代器(并更新所有使用旧接口的代码,使其使用向量的迭代器)。

标签: c++ iterator c++20 c++-concepts


【解决方案1】:

如果它包含您目前正在使用的代码,您的问题会更清楚。但是,从字里行间看,最简单的解决方案可能正是 Peter 在 cmets 中所说的:只需让您的 beginend 方法公开您的私有 vector 成员的开始/结束迭代器。

class Book {};

class Library {
    std::vector<Book> books_;
public:
    auto begin() const { return books_.begin(); }
    auto end() const { return books_.end(); }
};
static_assert(std::ranges::contiguous_range<Library>);
static_assert(std::same_as<std::ranges::iterator_t<Library>,
                           std::vector<Book>::const_iterator>);
~~~
assert(std::ranges::is_sorted(mylibrary, ByAuthor());

在这里,我的LibraryBook 对象的可迭代(和连续)范围。 我也可以通过暴露非常量迭代使其成为可变范围:

class Library {
    std::vector<Book> books_;
public:
    auto begin() { return books_.begin(); }
    auto end() { return books_.end(); }
    auto begin() const { return books_.begin(); }
    auto end() const { return books_.end(); }
};

static_assert(std::same_as<std::ranges::iterator_t<Library>,
                           std::vector<Book>::iterator>);
static_assert(std::same_as<std::ranges::iterator_t<const Library>,
                           std::vector<Book>::const_iterator>);
~~~
std::ranges::sort(mylibrary, ByAuthor();

另一种方法是编写自己的迭代器类型 — 公开 operator*operator++operator== 等的类类型。对于您可以用自己的内容充实的完整工作骨架,请参阅"In C++20, how do I write a contiguous iterator?" 的公认答案 - 随机访问迭代器的答案将完全相同,只是您不会提供 element_type 成员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-27
    • 2021-10-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多