【问题标题】:Using C++ Iterator on a set of one only element在一组唯一元素上使用 C++ 迭代器
【发布时间】:2018-06-19 17:39:36
【问题描述】:

我几乎一直在对一组大小大于三个的元素使用迭代器,但碰巧生成的集合只包含一个元素,在这种情况下,是以下循环:

for(i = data_set.begin(); i != data_set.end(); i++)
{
//do something with the data
}

即使"data_set" 不为空,也永远不会输入,因为data_set.begin()==data_set.end() 我正在做一个单独处理这种特殊情况的测试,但代码变得一团糟,不再干净。

应该怎么做才能正确处理这个问题?

谢谢,

大叔

【问题讨论】:

  • data_set.end() 是“一个过去的结尾”。它将被输入。
  • 你误会data_set.begin()==data_set.end() 只是空集,句号
  • 这应该可以正常工作。请在例如coliru.stacked-crooked.com 上创建minimal reproducible example 以显示错误。
  • 永远不会进入 -- 你为什么不写一个小测试?你会看到它被输入了。
  • 奇怪的想法,你真以为每个人都专门处理1号容器?呵呵

标签: c++ for-loop iterator


【解决方案1】:

如果集合仅包含 1 个元素,则: std::next( data_set.begin() ) == data_set.end(),因为begin() 迭代器指向容器的第一个元素,而end() 指向最后一个元素之后的下一个元素。

【讨论】:

  • 好的。谢谢你的回答。
  • 在容器末端的迭代器上调用std::next是否有效?
  • @GoverNator -- 不,行为未定义。您链接到的示例是错误的。
  • @PeteBecker 我同意这很奇怪,但是示例有什么问题?它不像 UB 那样工作。
  • @GoverNator -- 它取消引用容器的过去的结束迭代器。在容器中有两个元素,std::next(s.begin(),2) 为您提供了过去的迭代器。不允许取消引用或增加它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多