C++ 检查归约迭代器是否指向有效元素

C++ 检查归约迭代器是否指向有效元素,c++,C++,我需要知道我是否可以减少迭代器并拥有一个有效的对象。下面的错误是因为我将迭代器减少了1,这是不存在的。我怎么知道这样我就不会出错 ticks.push_front(Tick(Vec3(0, 0, 5), 0)); ticks.push_front(Tick(Vec3(0, 0, 8), 100)); ticks.push_front(Tick(Vec3(0, 0, 10), 200)); bool found = false; list<Tick, allocator<Ti

我需要知道我是否可以减少迭代器并拥有一个有效的对象。下面的错误是因为我将迭代器减少了1,这是不存在的。我怎么知道这样我就不会出错

ticks.push_front(Tick(Vec3(0, 0, 5), 0));
ticks.push_front(Tick(Vec3(0, 0, 8), 100));
ticks.push_front(Tick(Vec3(0, 0, 10), 200));

bool found = false;
    list<Tick, allocator<Tick>>::iterator iter;
    for (iter = ticks.begin(); iter != ticks.end(); ++iter)
    {
        Tick t = (*iter);

        if (214>= t.timestamp)
        {
            prior = t;
            if (--iter != ticks.end())
            {
                next = (*--iter);
                found = true;
                break;
            }
        }
    }
ticks.push_front(Tick(Vec3(0,0,5,0));
滴答声。向前推(滴答声(Vec3(0,0,8,100));
滴答声。向前推(滴答声(Vec3(0,0,10,200));
bool-found=false;
迭代器iter;
for(iter=ticks.begin();iter!=ticks.end();++iter)
{
勾选t=(*iter);
如果(214>=t.时间戳)
{
先验=t;
如果(--iter!=ticks.end())
{
下一步=(*——iter);
发现=真;
打破
}
}
}

我试图找到列表中214值正上方和正下方的条目。如果只有1个,那么我不在乎。我需要上下才能存在。

在你对问题进行编辑后,我想我可以写出比以前更好的答案

首先,为使用时间戳的Ticks编写一个比较函数:

bool CompareTicks(const Tick& l, const Tick& r)
{
   return l.timestamp < r.timestamp;
}
这将为您提供第一个大于214的元素。接下来,您可以使用
下限
查找>=214的第一个元素:

// get an iterator pointing to the first element in ticks that is >= 214
// I'm assuming the second parameter to Tick's ctor is the timestamp
auto itBelow = std::lower_bound(ticks.begin(), ticks.end(), Tick(Vec3(0, 0, 0), 214), CompareTicks);
现在,您必须对下面的
itdown
执行一个额外步骤,以获得214之前的第一个元素,注意不要超过列表的开头:

if(itBelow == ticks.begin())
   ; // there is nothing in ticks < 214. I don't know what you want to do in this case.
else
   --itBelow;
if(itBelow==ticks.begin())
; // 滴答声<214中没有任何内容。我不知道你在这种情况下想做什么。
其他的
--下文;
现在,假设您没有遇到任何错误情况,
itAbove
指向第一个元素>214,而
itBelow
指向最后一个元素<214


这假设您的
勾号
是按时间戳排序的,似乎就是这样。还要注意的是,即使列表中有多个214,这种技术也会起作用。最后,您说列表很短,因此不值得担心时间复杂度,但如果您还将
列表
替换为
向量
,而不是线性迭代方法,则此技术可以获得对数性能。

编辑问题后,我想我能写出比以前更好的答案

首先,为使用时间戳的Ticks编写一个比较函数:

bool CompareTicks(const Tick& l, const Tick& r)
{
   return l.timestamp < r.timestamp;
}
这将为您提供第一个大于214的元素。接下来,您可以使用
下限
查找>=214的第一个元素:

// get an iterator pointing to the first element in ticks that is >= 214
// I'm assuming the second parameter to Tick's ctor is the timestamp
auto itBelow = std::lower_bound(ticks.begin(), ticks.end(), Tick(Vec3(0, 0, 0), 214), CompareTicks);
现在,您必须对下面的
itdown
执行一个额外步骤,以获得214之前的第一个元素,注意不要超过列表的开头:

if(itBelow == ticks.begin())
   ; // there is nothing in ticks < 214. I don't know what you want to do in this case.
else
   --itBelow;
if(itBelow==ticks.begin())
; // 滴答声<214中没有任何内容。我不知道你在这种情况下想做什么。
其他的
--下文;
现在,假设您没有遇到任何错误情况,
itAbove
指向第一个元素>214,而
itBelow
指向最后一个元素<214


这假设您的
勾号
是按时间戳排序的,似乎就是这样。还要注意的是,即使列表中有多个214,这种技术也会起作用。最后,您说列表很短,因此不值得担心时间复杂度,但如果您还将
列表
替换为
向量
,而不是线性迭代方法,则此技术可以获得对数性能。

编辑问题后,我想我能写出比以前更好的答案

首先,为使用时间戳的Ticks编写一个比较函数:

bool CompareTicks(const Tick& l, const Tick& r)
{
   return l.timestamp < r.timestamp;
}
这将为您提供第一个大于214的元素。接下来,您可以使用
下限
查找>=214的第一个元素:

// get an iterator pointing to the first element in ticks that is >= 214
// I'm assuming the second parameter to Tick's ctor is the timestamp
auto itBelow = std::lower_bound(ticks.begin(), ticks.end(), Tick(Vec3(0, 0, 0), 214), CompareTicks);
现在,您必须对下面的
itdown
执行一个额外步骤,以获得214之前的第一个元素,注意不要超过列表的开头:

if(itBelow == ticks.begin())
   ; // there is nothing in ticks < 214. I don't know what you want to do in this case.
else
   --itBelow;
if(itBelow==ticks.begin())
; // 滴答声<214中没有任何内容。我不知道你在这种情况下想做什么。
其他的
--下文;
现在,假设您没有遇到任何错误情况,
itAbove
指向第一个元素>214,而
itBelow
指向最后一个元素<214


这假设您的
勾号
是按时间戳排序的,似乎就是这样。还要注意的是,即使列表中有多个214,这种技术也会起作用。最后,您说列表很短,因此不值得担心时间复杂度,但如果您还将
列表
替换为
向量
,而不是线性迭代方法,则此技术可以获得对数性能。

编辑问题后,我想我能写出比以前更好的答案

首先,为使用时间戳的Ticks编写一个比较函数:

bool CompareTicks(const Tick& l, const Tick& r)
{
   return l.timestamp < r.timestamp;
}
这将为您提供第一个大于214的元素。接下来,您可以使用
下限
查找>=214的第一个元素:

// get an iterator pointing to the first element in ticks that is >= 214
// I'm assuming the second parameter to Tick's ctor is the timestamp
auto itBelow = std::lower_bound(ticks.begin(), ticks.end(), Tick(Vec3(0, 0, 0), 214), CompareTicks);
现在,您必须对下面的
itdown
执行一个额外步骤,以获得214之前的第一个元素,注意不要超过列表的开头:

if(itBelow == ticks.begin())
   ; // there is nothing in ticks < 214. I don't know what you want to do in this case.
else
   --itBelow;
if(itBelow==ticks.begin())
; // 滴答声<214中没有任何内容。我不知道你在这种情况下想做什么。
其他的
--下文;
现在,假设您没有遇到任何错误情况,
itAbove
指向第一个元素>214,而
itBelow
指向最后一个元素<214

这假设您的
勾号
是按时间戳排序的,似乎就是这样。还要注意的是,即使列表中有多个214,这种技术也会起作用。最后,您说列表很短,因此不值得担心时间复杂性,但是如果您还需要重复,这种技术可以获得对数性能