在基于范围的 for 循环中找到具有连续内存的序列中元素的位置

finding the position of an element in a sequence with continuous memory in a range based for loop

std::vector 或 c 数组上的现代 C++ 基于范围的 for 循环的 运行 期间。我最初的猜测是不,除非你使用指针和指针数学但只是想检查一下。我想做的是检查相邻元素以检查它们如何影响我当前的代码。我也知道向量中的项目还有更多。代码类似于:

std::vector<Item> v;
// do work
for(auto& item : v)
{
    //do more work
    auto pos = //some way to find get the position
    if(/*pos is the first position*/)
    {
          process(item, pos+1);
    }
    else if(/*pos is the last position*/)
    {
          process(item, pos-1);
    }
    else
    {
          process(item, pos-1, pos+1);
    }
}

如果对象是第一个对象、最后一个对象或中间对象,我不关心迭代器。

执行此操作的一种方法是使用 std::find. Then if you found the element, you can use std::distance 计算索引来搜索元素。

std::vector<int> myVec;
int valToFind = 5;

auto it = std::find(myVec.begin(), myVec.end(), valToFind);
if (it != myVec.end())
{
    int index = std::distance(myVec.begin(), it);
}

请注意,由于 std::vector 是连续的,您也可以从指针运算中获得相同的值

if (it != myVec.end())
{
    int index = it - myVec.begin()
}

查找索引(在 std::find 之后)的两种方法都是 O(1),因为向量是随机访问容器。

对于具有连续记忆的序列:

for(const auto& element : sequence) {
    // If the sequence has a member data()
    // std::array, std::vector or std::string 
    auto index = &element - sequence.data();

    // If the sequence is an array
    auto index = &element - sequence;

    // If the sequence supports operator []
    // All of above
    auto index = &element - &sequence[0];

    // Generally
    auto index = &element - &*std::begin(sequence);
}