【问题标题】:How to check whether the iterator hit the end without container?如何检查迭代器是否在没有容器的情况下结束?
【发布时间】:2013-09-01 04:15:51
【问题描述】:

例如,如何在没有任何其他信息的情况下实现以下功能?

bool isEnd(set<int> :: iterator itr);

我知道我可以这样做,但是没有输入变量“s”怎么办?

bool isEnd(const set<int> &s, set<int> :: iterator itr) {
    return itr == s.end();
}

【问题讨论】:

  • 你不能。迭代器本身没有任何内容表明它已经结束,您需要另一个迭代器来比较它。

标签: c++ stl


【解决方案1】:

你没有。

一个范围是两个迭代器,当你移动迭代器时,你应该几乎总是在一个范围上工作。

容器也是范围,因此您可以随身携带容器,但通常不需要完整的容器。

【讨论】:

  • 我不得不不同意。例如在字符串中,您可以使用string::npos 轻松检查迭代器是否指向结束,而无需引用原始字符串。
  • @ChiragArora 您可以判断 index 是否指向“过去”结尾,但不能判断迭代器。
【解决方案2】:

使用标准 C++ 库,无法编写。

std::set 可以实现为例如red-black trees,然后迭代器就是里面的节点,你需要整个树来判断那个节点是不是最后一个。

【讨论】:

  • 实际上,对于像std::set 这样的rbtree,迭代器是节点指针,end() 始终是指向特殊的“不是实际数据节点”节点的指针,所以这很容易。有问题的情况是std::vector,其中迭代器只是指向向量数据数组的指针,您需要向量的size 来确定何时到达终点。
猜你喜欢
  • 2014-08-07
  • 1970-01-01
  • 2023-04-10
  • 2021-09-20
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多