迭代器重载成员选择与间接运算符
iterator Overload Member Selection vs Indirection Operator
所以为了创造一个Minimal. Complete, Verifiable Example我在这里创造了一个玩具iterator
(我知道它并不完美,它只是为了问一个问题):
class foo : public iterator<input_iterator_tag, string> {
string _foo;
static const size_t _size = 13;
public:
const string& operator*() { return _foo; }
const foo& operator++() {
_foo += '*';
return *this;
}
const foo operator++(int) {
auto result = *this;
_foo += '*';
return result;
}
bool operator==(const foo& rhs) { return _foo.empty() != rhs._foo.empty() && _foo.size() % _size == rhs._foo.size() % _size; }
bool operator!=(const foo& rhs) { return !operator==(rhs); }
};
我读到 InputIterator 需要定义成员选择运算符。间接运算符是有道理的,但成员选择运算符在这里让我感到困惑。如何为 foo
实施成员选择运算符?
operator->()
应该 return 一个指针类型,该指针类型是容器持有的使用迭代器的类型。因此,如果您有一个装有 std::string
的容器,那么 iterator::operator->
应该 return 和 std::sting*
。在你的情况下,因为你从 std::iterator
派生,你可以使用 pointer
typedef 作为 return 类型。
const string* operator->() const { return &_foo; }
用法示例:
foo i;
++i;
assert(i->length() == 1);
它的工作方式是编译器将生成对 operator->
的重复调用,直到 return 类型是原始指针(因此在这种情况下只调用一次 foo::operator->
) , 然后对该指针进行常规的成员选择操作。
所以为了创造一个Minimal. Complete, Verifiable Example我在这里创造了一个玩具iterator
(我知道它并不完美,它只是为了问一个问题):
class foo : public iterator<input_iterator_tag, string> {
string _foo;
static const size_t _size = 13;
public:
const string& operator*() { return _foo; }
const foo& operator++() {
_foo += '*';
return *this;
}
const foo operator++(int) {
auto result = *this;
_foo += '*';
return result;
}
bool operator==(const foo& rhs) { return _foo.empty() != rhs._foo.empty() && _foo.size() % _size == rhs._foo.size() % _size; }
bool operator!=(const foo& rhs) { return !operator==(rhs); }
};
我读到 InputIterator 需要定义成员选择运算符。间接运算符是有道理的,但成员选择运算符在这里让我感到困惑。如何为 foo
实施成员选择运算符?
operator->()
应该 return 一个指针类型,该指针类型是容器持有的使用迭代器的类型。因此,如果您有一个装有 std::string
的容器,那么 iterator::operator->
应该 return 和 std::sting*
。在你的情况下,因为你从 std::iterator
派生,你可以使用 pointer
typedef 作为 return 类型。
const string* operator->() const { return &_foo; }
用法示例:
foo i;
++i;
assert(i->length() == 1);
它的工作方式是编译器将生成对 operator->
的重复调用,直到 return 类型是原始指针(因此在这种情况下只调用一次 foo::operator->
) , 然后对该指针进行常规的成员选择操作。