【问题标题】:Iterators for a string class字符串类的迭代器
【发布时间】:2012-12-04 12:58:54
【问题描述】:

我正在创建一个字符串类(项目学校),我一直到最后为它创建迭代器,所以我的问题是我不知道从哪里开始我认为开始和结束但是这些是如何实现的.这是到目前为止的代码:

class StringsTest {


public:
std::tr1::shared_ptr<char* > word; 
char* data;
int size;
int final;
int itSize;
StringsTest();
StringsTest(const StringsTest& orig);
virtual ~StringsTest();
StringsTest(char* strings);
StringsTest& swap( StringsTest& str2 );
int push_back(char a);
char pop_back();
int insert(int where, char what);
int erase(int where);
friend void operator<<(std::ostream& Ostr, const StringsTest& st);
friend std::istream& operator>>(std::istream& Istr, StringsTest& st);
char &operator[](int i);
int sizes();
int check();
stringIte& begin();
stringIte& end();



private:

protected:
};

#endif  /* STRINGPROJ_H *

//#endif    /* STRINGSTEST_H */

class stringIte {
public:
stringIte();
~stringIte();

还有开头:

stringIte& StringsTest::begin() {
try {


} catch (std::exception e) {
    std::cout << " an error has ocurred " << e.what() << std::endl;
}
}

stringIte& StringsTest::end() {
try {



} catch (std::exception e) {

    std::cout << "nope " << e.what() << std::endl;

}
}

我有这个类,我如何实现迭代器 begin()。谢谢。

【问题讨论】:

  • -1 表示没有显示任何研究工作。你可以学习std::string,看看它是如何实现迭代器的
  • 我正在阅读它这是另一个领域,如果我不明白什么,我会来这里。 (:

标签: c++ string iterator


【解决方案1】:

首先,您不想通过引用返回迭代器。按值返回。

迭代器就像指向集合元素的指针(在您的情况下指向字符串中的字符)。实现它们的一种方法是只做typedef char *stringIte; 并使用原始指针作为您的迭代器(它们提供所有必要的功能)。然后begin() 将返回dataend() 将返回data + size(假设data 是指向字符串数据的指针,size 是它的长度,没有终止NUL

一种更奇特的方式可能是一个简单的结构,例如包含StringTest*int,并在取消引用时从字符串中返回适当的字符。

【讨论】:

  • end() 应该返回 data + size,而不是 data + size + 1。半开区间的好处之一是end() - begin() == size()
  • @JamesKanze 谢谢,已修复。我过度考虑了终止 NUL 的场景。
  • @Pedro311 “STL 方式”是什么意思? char* 模型 RandomAccessIterator,所以它完成了 STL 随机访问迭代器所做的所有事情。另外,请参阅我的答案中的“更花哨的方式”。
  • 如果您查看最新的ISO C++ draft 到 [iterator.iterators] 和后续部分,您将看到“STL 迭代器”必须支持的所有操作。你会发现char* 支持所有这些。
  • @Angew btw,您可能想将您的书签更新为 open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3485.pdf ;)
【解决方案2】:

您已经拥有operator[]。最简单的解决方案是 让迭代器维护指向StringTest 的指针 对象和索引,并让它使用[] 运算符 需要时字符串。这有一个额外的优势,因为它 允许简单的错误检查。

如果迭代器可以实现更高效的实现 知道一些字符串类的内部结构。如果 实际字符在一个连续的数组中,例如, 迭代器可以由单个指针组成(甚至是 typedef 到char*)。

【讨论】:

    猜你喜欢
    • 2012-10-23
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2012-08-19
    • 2014-04-21
    • 2012-01-06
    • 1970-01-01
    相关资源
    最近更新 更多