【问题标题】:sregex_iterator next and end.. How does this work?sregex_iterator next 和 end.. 这是如何工作的?
【发布时间】:2021-05-19 12:35:39
【问题描述】:

伙计们,我是 C++ 新手。所以请原谅我在这里的无知。我试图理解我上网的以下代码。 while (next != end) 行到底做了什么?当我打印 &next 和 &end 的地址时,它们总是不同的(甚至发布 while 循环)。我认为std::sregex_iterator nextstd::sregex_iterator end 是两个不同的实例。那么while (next != end) 行怎么会认为它们在某个时间点会相等呢?我看着引擎盖下。好像是regex_iterator<string::const_iterator>

我试图了解构造函数等,但不想列出我发现的所有内容,因为它们可能不相关。只是为了让您知道我来自 Java 世界,但一直在学习了解 C++ 的课程。

非常感谢任何帮助。谢谢

string subject("This is a test");
    try {
      std::regex re("\\S+");
      std::sregex_iterator next(subject.begin(), subject.end(), re);
      std::sregex_iterator end;
       
      while (next != end) {     
        std::smatch match = *next;
        std::cout << match.str() << "\n";
        std::cout << match.position() << "\n";
        next++;    
      }
      
    } catch (std::regex_error& e) {
      // Syntax error in the regular expression
    }

【问题讨论】:

  • = 检查相等而不是身份。您可能来自 Java 吗? C++ 使用值语义。你可以有两个比较相等的对象,例如int x = 3; int y = 3; 然后x==ytrue 即使&amp;x != &amp;y
  • C++ 中的== 运算符不一定比较地址。 nextend 是迭代器(可以用来在集合中移动的东西;通常作为指针上的外观实现)。
  • 哦,是的 Java ;)。不要试图将你从 java 中学到的知识应用到 C++ 中。尽管看起来语法非常相似,但它们在实际工作方式上几乎没有什么不同
  • @largest_prime_is_463035818 - 是的,所以在某个时间点,next 和 end 的值都将是空值(类似于 null)并且 while 循环将终止?试图打印 next 和 end 的值,但它不喜欢它。我假设像 Java 中的 toString 一样,在 C++ 中有一些运算符或一些重载,完成后将有助于打印值?
  • 是的,您的问题有两个方面。我试图在答案中解决这两个问题

标签: c++ c++11 c++17


【解决方案1】:

只是为了让您知道我来自 Java 世界,但一直在学习了解 C++ 的课程

这似乎是你困惑的原因。与 Java 相比,C++ 使用值语义。这意味着,当您通过== 比较两个对象时,它不会测试身份,而是测试相等性,即比较值。

考虑一下

int x = 42;
int y = 42;

这是两个不同的对象,但它们的值是相同的:

assert( x == y );
assert( &x != &y );

Java 有这种盒装和简单类型的怪癖(不确定它们实际上是如何调用的),但在 C++ 中,可以重载 == 的自定义类型也有望使用值语义。例如

std::string x{"Foo"};
std::string y{"Foo"};
assert( x == y );
assert( &x != &y );

输入迭代器通常事先不知道输入在哪里结束。例如,std::istream_iterator 也是如此。在这种情况下启用next != end 的一种可能方法是operator++ 设置一些内部状态,表明已到达输入结束。然后next != end,只需检查该标志是否在next 中设置(当然也需要end,即默认构造的迭代器是“特殊的”,虽然这是实现细节,基本上你只需要知道它工作;)。

【讨论】:

  • 非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2015-07-31
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 2023-03-11
相关资源
最近更新 更多