繁体   English   中英

通过索引访问矢量迭代器?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM