让我们假设我们有一个地图类(无序地图,列表,集合,也可以做任何事情)。我们正在寻找一个特定的元素。在调用find()成员之后,我们必须检查end()成员。但是find()在内部已经知道它是返回一个好的迭代器还是结束迭代器。我们为什么还需要再次调用end()?这增加了一些开销。
std::map<int,float> myMap;
// some other code to populate the map
// ...
std::map<int,float>::iterator myIt;
myIt = myMap.find(2); // doesn't this already know wheter its returning the end() iterator?
if (myIt != myMap.end()) { //calling end() here wastes some time because find
//already knew the result
std::cout << "Found, value is "<<(*myIt).second<<"\n";
} else {
std::cout << "Not found.\n";
}
应该有一种方法可以在不调用end()的情况下知道find()的结果。
答案 0 :(得分:7)
还有什么可能回归?它需要返回一个有效的迭代器,但end()
以外的任何东西都会引用容器中的实际元素。这里真的没有选择。
此外,诸如end()
之类的STL函数通常是内联的,并且编译器会进行相当多的优化,因此额外的调用实际上不是一个调用。
答案 1 :(得分:1)
替代方案是可能的 - 例如,find()可以返回一个std :: pair或类似于boost :: optional的东西 - 但是它没有什么实际优势,它需要一个更丑陋,更容易出错的编码风格。在语言(主要是解释)中使用内置的无/空标记,这是理想的值,但C ++不会添加,因为在每个变量上都标记了一个bool,并且突然说“任何人都是不切实际的”想要存储整数,请注意:-78此后保留给end()/ Null /无论如何,请不要将其用于其他目的“。容器类是最好(唯一)的地方,知道哪个值是一个合适的哨兵,作为一个合法的迭代器没有意义,并允许一个简单的,闪电般的快速!=测试,或者如果有必要加强该bool并使用更复杂的迭代器结构:end()摘要,并将在实践中内联,以减轻您的性能问题。