【问题标题】:What will this code print on screen?此代码将在屏幕上打印什么?
【发布时间】:2017-07-02 15:22:41
【问题描述】:

我需要帮助弄清楚为什么当我运行此代码时它会打印 (8,8) (8,8) (0,8) (7,8) (6,8) (5,8) (4,8) (3,8) (1,8) (0,8) (8,8) 在屏幕上。 我不明白递增和递减运算符如何在函数g 中对迭代器uv 起作用。 我知道该集合将包含元素 0、1、3、4、5、6、7、8。但我不明白“遍历”集合是如何工作的。

template <typename T>
std::complex<double> g(T &u, T &v) { return {*--u, *v++}; }

std::set<int> s{3, 8, 4, 7, 0, 1, 1, 5, 7, 3, 6};
std::set<int>::iterator v(s.begin()), w(s.end());
while (v != w) std::cout << g(v, w) << " ";
std::cout << std::endl;

【问题讨论】:

  • 这时你需要使用一些调试方法。使用打印调试或使用调试器,并在程序运行时逐行遍历程序。这就是你看到程序内部发生的事情的方式。
  • 运行它时,它会打印什么?你期待什么?请编辑您的问题以包含它。
  • 我确实这样做了,但我仍然不明白为什么迭代器 v 的常量值为 8。

标签: c++ c++11 iterator set


【解决方案1】:

您正在递减 s.begin() 并递增 s.end()。两者都会导致未定义的行为

【讨论】:

  • 这不是我的代码。这是我考试的一个问题,我必须写下这部分会做什么。我明白当我递减 s.begin (v) 时会发生什么,但我不明白 w 在 g 函数中会发生什么。
  • @Lamija37 我想说唯一正确的答案是“由于未定义的行为而无法预测”。如果您想确切地知道发生了什么,为什么不查看标准库代码呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2014-11-23
  • 2012-05-03
  • 1970-01-01
相关资源
最近更新 更多