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

ExO*_*uhr 3 c++ iterator stl

假设代码看起来像这样模糊:

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

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

(如果只是取消引用end()和更多引发异常而不是生成未定义的行为!)

seh*_*ehe 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++;
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*son 5

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

您需要传递两个迭代器,或者传递一个不同的结构,例如a range(它在boostC++ 0x IIRC中).