(C ++)当只有迭代器可用时,为迭代器找到end()?

时间:2012-09-28 00:20:00

标签: c++ stl iterator

假设代码看起来像这样:

bool LoadGame() {
  vector<string> SaveFile = LoadFromSaveFile();
  Data = SaveFile.begin();
  LoadCharacters(&Data);
    // containing LoadOneCharacter(&Data) calls
  LoadLocations(&Data);
    // >> LoadOneLocation(&Data) calls
  // etc.
}

有没有办法在LoadCharacters(),LoadLocations()等内部检查Data当前是否指向SaveFile :: end(),而不将SaveFile :: end()传递给LoadGame调用的所有函数( )?

(如果仅取消引用end()及更高版本而引发异常而不是生成未定义的行为!)

2 个答案:

答案 0 :(得分:5)

在一般情况下

,这是不可能的

在特定情况下,您可以利用迭代器实现的特定于实现的详细信息来获取容器。

标准容器库的迭代器没有此类详细信息记录 AFAIR。


一个特殊情况是输入迭代器,如std::istream_iterator<>,它总是可以与默认构造的实例进行比较,以检查输入结束。

std::istringstream iss("test");
std::istream_iterator<char> it(iss);

// you can always check for end of input:
while (std::istream_iterator<char>() != it)
{
    it++;
}

答案 1 :(得分:5)

一般来说,这是不可能的。在许多实现中,许多类型的迭代器只是指针,并且不了解底层容器。

您需要传递两个迭代器,或者传递一个不同的结构,例如range(在boost但不在C ++ 0x IIRC中)。