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