首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载++运算符以递增迭代器

重载++运算符以递增迭代器
EN

Stack Overflow用户
提问于 2012-02-22 06:24:47
回答 3查看 12.8K关注 0票数 2

我目前正在创建一个方形列表,其中一个要求是重载前缀和后缀++操作符。

我试图重载.hpp文件中的++operator以递增迭代器。但在调用++operator时,它不会调用重载的代码,而只是使用默认值。

代码语言:javascript
复制
iterator& operator ++ () {  // pre-increment 
        std::list<int>::iterator i = list_Values.begin(); 
        advance(i,1); 
        return &*i; 
    } 

    iterator operator ++ (int) { // post-increment 
        std::list<int>::iterator i = list_Values.begin(); 
        advance(i,1); 
        return &*i; 
    } 

我尝试这样调用++operator:

代码语言:javascript
复制
int* test = sqrList.begin();
  ++test;

  test++;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-22 07:02:22

代码语言:javascript
复制
int* test = sqrList.begin();
++test;
test++;

您正在递增一个int*,并且由于没有要扩展的int*类,因此您不可能真正为该类型创建了运算符。

而是为正确的类型创建操作符。您的意思可能是创建自己的迭代器类型。

票数 2
EN

Stack Overflow用户

发布于 2012-02-22 06:26:45

你必须在类中声明运算符。

代码语言:javascript
复制
class Iterator
{
public:
    Iterator& operator ++ ()
    {
       return *this;
    }
    Iterator operator ++ (int)
    {
       return *this;
    }
};

另外,您为什么要使用return &*i;

请注意,这些操作符需要在Iterator类中声明,而不是在容器中声明。

票数 2
EN

Stack Overflow用户

发布于 2019-05-05 21:12:02

对于新手来说,有时很难脱离上下文来理解一个问题。因此,我决定提供一个或多或少完整的示例来定义自定义迭代器和重载它的运算符。请注意,当重载post增量运算符时,我们按值返回迭代器,而不是按引用。当然,这不是一个真实的例子,我们不会使用原始指针。

代码语言:javascript
复制
#include<iostream>
#include<assert.h>

struct node
{
    int data;
    node* next;
    node() :data(0), next(nullptr) {}
    node(int d) :data(d), next(nullptr) {}
};

//forward declaration
class MyList;

class MyListIterator
{
private:
    node* _ptr;
    friend class MyList;
    explicit MyListIterator(node* n) : _ptr(n) {}
public:
    int& operator*() const {
        return _ptr->data;
    }
    //overload pre increment operator
    MyListIterator& operator++() {
        _ptr = _ptr->next;
        return *this;
    }
    // overload post increment operator
    MyListIterator operator++(int) {
        MyListIterator ret = *this;
        ++* (this);
        return ret;
    }

    bool operator==(const MyListIterator& iter) const {
        return this->_ptr == iter._ptr;
    }

    bool operator!=(const MyListIterator& iter) const {
        return this->_ptr != iter._ptr;
    }
};

class MyList
{
private:
    node* _head;
    node* _tail;
    size_t _size;
public:
    MyList() : _head(nullptr), _tail(nullptr), _size(0) {};

    void push_back(int d) {
        node* newTail = new node(d);
        if (_tail != nullptr) {
            _tail->next = newTail;
        }
        else {
            _head = newTail;
        }
        _tail = newTail;
        _size++;
    }

    int& operator[](size_t i) {
        if (i >= _size)
            throw std::out_of_range("MyList");
        node * p = _head;
        for (size_t j = 0; j < i; j++) {
            p = p->next;
        }
        return p->data;
    }

void remove(int d) {
    if (_head == nullptr)
        return;
    node * p = _head;
    node * prev = p;
    while ((p != nullptr) && (p->data != d)) {
        prev = p;
        p = p->next;
    }
    if (p != nullptr) {
        if (p == _head)
            _head = p->next;
        else
            prev->next = p->next;
        delete p;
        _size--;
    }
}

    size_t size() const {
        return _size;
    }

    ~MyList() {
        node* next = nullptr;
        for (node* p = _head; p != nullptr; p = next) {
            next = p->next;
            delete p;
        }
    }
    using iterator = MyListIterator;
    iterator begin() { return iterator(_head); }
    iterator end() { return iterator(_tail->next); }
};

int main()
{

    MyList mylist;
    mylist.push_back(1);
    mylist.push_back(2);
    mylist.push_back(3);
    int count = 1;
    //pre increment
    for (MyListIterator it = mylist.begin(); it != mylist.end(); ++it)
        assert(*it == count++);
    count = 1;
    //post increment
    for (MyListIterator it = mylist.begin(); it != mylist.end(); it++)
        assert(*it == count++);
    for (size_t i = 0; i < 3; i++)
        assert(mylist[i] == i + 1);

    mylist.remove(2);
    assert(mylist[0] == 1);
    assert(mylist[1] == 3);
    assert(mylist.size() ==2);

    mylist.remove(1);
    mylist.remove(3);
    assert(mylist.size() == 0);

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9386266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档