gpt4 book ai didi

c++ - 制作可用于初始化 vector 的迭代器

转载 作者:太空狗 更新时间:2023-10-29 21:33:23 24 4
gpt4 key购买 nike

我在为我的类创建可用于初始化 vector 的迭代器类型时遇到一些问题。可能最好用一些代码来解释,下面是我的实现的示例:

#include <tuple>
#include <cstdint>

struct Foo
{
public:
Foo(uint8_t i) : i(i) {}
struct iterator
{
public:
using value_type = std::pair<int, bool>;
using reference = value_type;
using pointer = value_type*;
using iterator_category = std::input_iterator_tag;

bool operator == (const iterator& other) { return cur == other.cur; }
bool operator != (const iterator& other) { return !(*this == other); }

iterator& operator ++ () { if (cur > -1) --cur; return *this; }
iterator operator ++ (int) { iterator tmp = *this; ++(*this); return tmp; }

reference operator * () { return std::make_pair<int, bool>(8 - cur, foo->i & (1 << cur)); }
pointer operator -> () { static value_type v; v = *(*this); return &v; }
private:
friend Foo;
iterator(const Foo* foo, int start) : foo(foo), cur(start) {}
const Foo* foo;
int cur;
};

iterator begin() const { return iterator(this, 7); }
iterator end() const { return iterator(this, -1); }

uint8_t i;
};

类的逻辑无关紧要;事实上,尽管我可以在 for 循环中使用此迭代器,但在尝试从中构造 vector 时出现错误:

#include <iostream>
#include <vector>

// struct Foo...

int main()
{
Foo foo(73);

// Works, output as expected
for (auto elem : foo)
std::cout << "Position " << elem.first << " is a " << elem.second << '\n';

// Works, output as expected
for (auto it = foo.begin(), end = foo.end(); it != end; ++it)
std::cout << "Position " << it->first << " is a " << it->second << '\n';

// Error: cannot convert argument 1 from 'PowersOf2::iterator' to 'const unsigned __int64'
std::vector<std::pair<int, bool>> v(foo.begin(), foo.end());
}

cppreference告诉我 std::vector 的构造函数采用两个迭代器如果 InputIt 满足 InputIteratorIt also tells me InputIterator 的要求是

  1. 满足迭代器
  2. 满足EqualityComparable
  3. i != j, *i, i->m, ++i, >(void)i++*i++ 有效

所以我不确定出了什么问题。任何帮助表示赞赏!

最佳答案

根据 cccpreference.com采用迭代器的 std::vector 构造函数 “[...] 仅在 InputIt 满足 InputIterator 时才参与重载决策,以避免与重载 (2) 产生歧义。” .

满足InputIterator类型必须满足 Iterator .反过来,Iterator 要求类型提供多个类型别名,包括您省略的 difference_type

尝试将公共(public)类型别名 using difference_type = std::ptrdiff_t; 添加到您的迭代器类型。

关于c++ - 制作可用于初始化 vector 的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51290907/

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