在基于范围的 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);
}
在 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);
}