【问题标题】:Using a std::string iterator to find the start and end of it's string使用 std::string 迭代器来查找它的字符串的开始和结束
【发布时间】:2011-01-23 01:04:31
【问题描述】:

仅给定一个 std::string 迭代器,是否可以确定字符串的起点和终点?假设我无权访问字符串对象,因此无法调用 string.begin() 和 string.end(),我所能做的就是递增或递减迭代器并测试值。

谢谢, 菲尔

【问题讨论】:

    标签: c++ iterator stdstring


    【解决方案1】:

    简短的回答是否定的。长答案是,因为不期望迭代器知道正在迭代的容器或范围,所以它们只期望知道

    • 能够跳转到下一个元素(inc 或 dec 到 next 或 prev)
    • 取消对自身的引用以显示对它们所指向的值的引用
    • 当然,将自己与其他迭代器进行比较,最重要的是某种“结束”迭代器。

    此外,某些类型的迭代器可能会做的不仅仅是上述内容,但主要是它们都需要以某种形式具有/执行上述内容。

    【讨论】:

    • 是的,您肯定需要指向末尾或开头的迭代器来比较您当前的迭代器,这可以在您定义字符串时确定?
    【解决方案2】:
    • 对于字符串的结束点: 假设内部字符串以空值结尾。然后通过解引用迭代器来查看它们是否为 '\0' 来确定下一个位置是终点。但是对于其他非空终止的字符串,是不可能知道这些信息的。
    • 对于字符串的起点: 没办法做这种事。

    默认的 std::string::iterator 只是一个随机的双向迭代器,对容器一无所知。

    但是如果你在 Visual C++ 平台上工作,也许你可以使用一些像下面这样的黑客方式来获取它的容器的控件,但这非常危险:

      // it is the passed in string::iterator parameter.
      if (it._Has_container()) {
          string* strRef = (string*)it._Mycont;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 2021-09-20
      相关资源
      最近更新 更多