【问题标题】:implement reverse_iterator for my string class (also rbegin() and rend() methods)为我的字符串类实现 reverse_iterator(还有 rbegin() 和 rend() 方法)
【发布时间】:2013-05-13 13:02:23
【问题描述】:

下面是我的 String 类的代码。我想实现 reverse_iterator 和 rbegin() 和 rend() 方法。 已粘贴分配方法的代码。 String::reverse_iterator rbegin = str2.rbegin(); String::reverse_iterator rend = str2.rend(); for(String::reverse_iterator b = rbegin; b!= rend; ++b) { cout

class String {//my custom string class

public:

    class iterator:public std::iterator<std::random_access_iterator_tag, char> {
    public:
        iterator():ch(NULL){}
        iterator(const iterator& it) : ch(it.ch) {}

        char& operator*() { return *ch; }
        iterator& operator++() {
            ch = ch+1;
            return *this;
        }
        bool operator==(const iterator& rhs) {
            return ch == rhs.ch;
        }
        bool operator!=(const iterator& rhs) {
            return ch != rhs.ch;
        }

    private:
        friend class String;
        iterator(char* c):ch(c) {}
        char* ch;
    };
    explicit String();
    String(const String& str);
    String(const char* s);
    ~String();
    iterator begin();
    iterator end();
private:
    char* _string;
    size_t _length;
    size_t _capacity;
};

//iterator to end
String::iterator String::end() {
    //return iterator();
    if(_length == 0) {
        return iterator(_string);
    } else {
        return iterator(_string+_length+1);
    }
}
void String::assign (const char* str) {
if(sizeof(str) >= max_size()) {
    throw std::bad_alloc("String size is greater than max size");
}
if(_string != NULL) {
    delete[] _string;
}
_length = strlen(str);
_capacity = _length < 5 ? 5 : _length;
_string = new char[_capacity+1];
memset(_string, 0, _capacity+1);
memcpy(_string, str, _length);
}

int main() {
    String str2;
    str2.assign("This is assigned");
    String::iterator begin = str2.begin();
    String::iterator end = str2.end();
    //below loop should print "This is assigned" and is working fine
    for(String::iterator b = begin; b!= end; ++b) {
        cout<<*b;
    }

    return 1;
}

【问题讨论】:

  • 为什么不能将end 用作rbeginbegin 用作rend,并将string 转换为char 数组,以便您可以通过索引访问数组?
  • 我尝试使用它,但它打印出垃圾字符和运行时错误。问题在于rend.Begin 指向字符串的第一个字符,但rend 应该在开始之前指向一个位置
  • 我明白了....你介意分享你的begin吗?
  • //迭代器开始 String::iterator String::begin() { return iterator(_string); }
  • 我不知道您是否关心更改原始字符串或使用额外的内存。如果没有,请反转字符串或将反转存储在另一个字符串中...然后您可以将beginend 用作rbeginend

标签: c++ iterator stdstring reverse-iterator


【解决方案1】:

反向迭代器可以用双向迭代器来实现:

typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

reverse_iterator rbegin()
{
  return reverse_iterator(end());
}

reverse_iterator rend()
{
  return reverse_iterator(begin());
}

...然后const 迭代器也一样

但是,您的前向迭代器实现需要是双向的,这意味着它还必须支持-- 运算符:

iterator& operator--() 
{
    --ch;
    return *this;
}

【讨论】:

  • 这为迭代器类的重载 operator==(const iterator& rhs) 给出错误。错误消息是“未找到采用 'const String::iterator' 类型的左侧操作数的运算符”
  • bool operator == (const iterator&amp;) 应该有一个 const 限定符
猜你喜欢
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
相关资源
最近更新 更多