鱼C论坛

 找回密码
 立即注册
查看: 6140|回复: 12

C++关于string(i,j)其中i和j都是迭代器,这个怎么理解

[复制链接]
发表于 2012-7-20 08:11:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在accelerated+C++中第6章1节的一段
if( i != str.end( ) )
      ret.push_back(string( i, j ));    //其中i和j都是迭代器
这里的string( i, j )要怎么理解呢?
请大师们教教!谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-20 08:35:46 | 显示全部楼层
用比较简单但不准确的方式解释下:
1.把string看成vector<char>,所以string也有迭代器(这个解释是很不准确的)
2.string( i, j )中i,j都是迭代器,这一对迭代器表示了一个序列区间。就是说用这个序列区间里的所有字符来初始化这个无名的临时string对象。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-20 10:33:34 | 显示全部楼层
看了下你说的这本书这个例子
里面迭代器属于basic_string的const_iterator

源码里有
        typedef const_iterator _It;
        basic_string(_It _F, _It _L, const _A& _Al = _A())
                : allocator(_Al) {_Tidy(); assign(_F, _L); }

里面的具体实现 要看侯捷的书 stl很不规范 难看懂的 知道有这回事就行了

迭代器就是位置呗 这个构造肯定是构造这一段位置的字符串

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-20 10:35:50 | 显示全部楼层
小鱼苗
帮顶
顺便混个脸熟
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-20 15:05:02 | 显示全部楼层
这里的string( i , j )是不是string的一种声明方法呢?我看网上有这种声明string s(beg,end)
那这里string( i , j )怎么去掉了标识符,我有点转不过弯来了!呵呵
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-20 15:26:40 | 显示全部楼层
我想我的基础太差!这本书的确很难看懂,但看了一些又舍不得扔,这本书的一个优点(我看了理解的),它的例子是串起来的,是同一个例子,慢慢的越来越复杂,知识点越来越深,功能也越来越多(看这书之前也是因为这个原因才看的)我在电子书上的注释都有一堆了,呵呵蛮有成就感的{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-20 16:03:34 | 显示全部楼层
这个还不理解 来看下解释:lol
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-20 18:40:06 | 显示全部楼层
楼主可以写个数组类
然后类里写个迭代器
迭代器要有一个位置记录当前元素地址
迭代器要重载++ ,!=,*
数组类里要写begin方法 和end方法 返回迭代器位置  所以迭代器构造也要写个管理类型的参数
这有个例子
  1. template<typename T>
  2. class Vector  
  3. {
  4. public:
  5.         Vector(int nSize)
  6.     {
  7.         if (nSize > 0)
  8.         {
  9.             m_nSize = nSize;
  10.             m_lpBase = new T[nSize];
  11.         }
  12.       
  13.     }
  14.         virtual ~Vector()
  15.     {
  16.         if (m_lpBase != NULL)
  17.         {
  18.             delete []m_lpBase;
  19.         }
  20.     }
  21. public:
  22.     T& operator[](int nIndex)
  23.     {
  24.         if (nIndex >=0 && nIndex < m_nSize)
  25.         {
  26.             return *(m_lpBase + nIndex);
  27.         }
  28.     }
  29. public:
  30.     void sort()
  31.     {
  32.         for (int i = 0; i < m_nSize; i++)
  33.         {
  34.             for (int j = i + 1; j < m_nSize; j++)
  35.             {
  36.                 if (*(m_lpBase + i) < *(m_lpBase + j))
  37.                 {
  38.                     T temp = *(m_lpBase + i);
  39.                     *(m_lpBase + i) = *(m_lpBase + j);
  40.                     *(m_lpBase + j) = temp;
  41.                 }
  42.             }
  43.         }
  44.     }

  45. class iterator
  46. {
  47. public:
  48.     iterator(T* lptype)
  49.     {
  50.         m_lpCur = lptype;
  51.     }
  52. public:
  53.     iterator operator++(int)
  54.     {
  55.         iterator temp(m_lpCur);
  56.         m_lpCur++;
  57.         return temp;
  58.     }
  59.     bool operator != (const iterator& obj)
  60.     {
  61.         return m_lpCur != obj.m_lpCur;
  62.     }
  63.     T operator*()
  64.     {
  65.         return *m_lpCur;
  66.     }
  67. public:
  68.     T* m_lpCur;

  69. };
  70. public:
  71.     int m_nSize;
  72.     T*  m_lpBase;
  73. public:
  74.     iterator begin()
  75.     {
  76.         return m_lpBase;
  77.     }
  78.     iterator end()
  79.     {
  80.         return m_lpBase + m_nSize;
  81.     }
  82. };
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-21 06:58:03 | 显示全部楼层
:funk:oh,my god!   class ?public?template?~~~~~~~我想我在搞清楚我的问题之前先要把这些给弄清楚了,好像问题越来越多了!:dizzy:
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-21 07:44:28 | 显示全部楼层
本帖最后由 仰望天上的光 于 2012-7-21 07:46 编辑

你不觉得你写的iterator类仅仅起到个改名的作用?
不如将
class iterator
{
public:
    iterator(T* lptype)
    {
        m_lpCur = lptype;
    }
public:
    iterator operator++(int)
    {
        iterator temp(m_lpCur);
        m_lpCur++;
        return temp;
    }
    bool operator != (const iterator& obj)
    {
        return m_lpCur != obj.m_lpCur;
    }
    T operator*()
    {
        return *m_lpCur;
    }
public:
    T* m_lpCur;

};

改为一行代码:
  1. typedef T* iterator;
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-21 09:59:24 | 显示全部楼层
本帖最后由 只爱你一人 于 2012-7-21 10:12 编辑

```````越来越复杂了
各位可不可以直接告诉我,我问题里的这个string( i , j )是不是相当于声明了一个string,原型大概是string(beg,end),作用就是复制半开区间[beg,end)之间的字符串,这样理解对吗?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-21 10:28:08 | 显示全部楼层
仰望天上的光 发表于 2012-7-21 07:44
你不觉得你写的iterator类仅仅起到个改名的作用?
不如将

数组确实可以这么理解  因为管理的指针++就等于+4字节  但是链表迭代器呢
++不重载 你指针加4字节是 下个节点地址?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-21 11:31:51 | 显示全部楼层
ccqiji 发表于 2012-7-21 10:28
数组确实可以这么理解  因为管理的指针++就等于+4字节  但是链表迭代器呢
++不重载 你指针加4字节是 下个 ...

是的,链表的迭代器当然要自己写。我的意思是这里就是数组而已,你写得那么复杂又没有什么特别的好处,用指针类型就可以了。
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-21 14:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表