![](/img/trans.png)
[英]Speed accessing a std::vector by iterator vs by operator[]/index?
[英]Accessing a vector iterator by index?
最近我在我的代码库中遇到了这个代码(当然是简化的)
auto toDelete = std::make_shared<std::string>("FooBar");
std::vector<decltype(toDelete)> myVec{toDelete};
auto iter = std::find_if(std::begin(myVec), std::end(myVec),
[](const decltype(toDelete) _next)
{
return *_next == "FooBar";
});
if (iter != std::end(myVec))
{
std::shared_ptr<std::string> deletedString = iter[0];
std::cout << *deletedString;
myVec.erase(iter);
}
现在,我注意到我们在这里通过索引访问迭代器!
std::shared_ptr<std::string> deletedString = iter[0];
我以前从未见过有人通过索引访问迭代器,所以我可以猜到的是迭代器被视为指针,然后我们访问指向指针的第一个元素。 那么代码实际上相当于:
std::shared_ptr<std::string> deletedString = *iter;
或者是未定义的行为?
从RandomAccessIterator的cppreference文档 :
表达:
i[n]
操作语义:
*(i+n)
由于std::vector
的迭代器满足RandomAccessIterator的要求,因此索引它们等同于添加和解除引用,就像普通指针一样。 iter[0]
相当于*(iter+0)
或*iter
。
这是标准符合行为
24.2.7随机访问迭代器[random.access.iterators]
1类或指针类型X满足随机访问迭代器的要求,除了满足双向迭代器的要求之外,以下表达式有效,如表118所示。
a[n]
可转换为参考:*(a + n)
请注意, 不要求将特定迭代器实现为指针。 具有重载operator[]
, operator*
和operator+
以及上述语义的任何迭代器类都可以工作。 对于std::vector
,迭代器类别是随机访问迭代器,它需要工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.