gpt4 book ai didi

c++ - 指针差异是否是在基于范围的 for 循环中查找 vector 中元素索引的有效方法?

转载 作者:行者123 更新时间:2023-12-05 01:26:05 25 4
gpt4 key购买 nike

使用指针差异来查找基于范围的 for 循环中元素的索引是否有效?

这里提出了很多关于同时使用索引和基于范围的循环的问题,但他们几乎都说如果您还需要元素的索引则不要使用基于范围的循环。但看起来,至少对于 std::vectorstd::array 和其他在内存中连续的容器,您可以使用指针差异来查找索引元素的元素,前提是您要遍历元素引用。例如:

// Prints the indices of all elements for which Foo::bar is true.
void Example(const std::vector<Foo>& v) {
for (const auto& e : v) {
if (e.bar()) {
auto index = &e - v.data(); // Valid???
std::cout << index << std::endl;
}
}
}

上面的代码可以正确编译和运行,但我不能完全确定它的有效性。任何语言律师都可以确认或否认这是否是一种可以接受的查找元素索引的方法?

此外,如果一个容器有一个 data() 成员,那么它的元素在内存中是连续的,因此使用这种方法是安全的吗?

最佳答案

如果底层迭代器满足 LegacyContiguousIterator (C++17) 的要求,则可以。此要求表明 *(itr + n)相当于*(addressof(*itr)+n) .

这是来自 https://en.cppreference.com/w/cpp/named_req/ContiguousIterator

C++20 将其替换为 contiguous_iterator概念。

Cppreference 页面指示vector<bool>不符合上述概念,但所有其他 vector 都符合。 string、string_view、array 和用于 valarray 的开始/结束重载的迭代器也是如此。

关于c++ - 指针差异是否是在基于范围的 for 循环中查找 vector 中元素索引的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70438520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com