假设代码看起来像这样:
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()及更高版本而引发异常而不是生成未定义的行为!)
答案 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中)。