C++ 检查归约迭代器是否指向有效元素
我需要知道我是否可以减少迭代器并拥有一个有效的对象。下面的错误是因为我将迭代器减少了1,这是不存在的。我怎么知道这样我就不会出错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
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,这种技术也会起作用。最后,您说列表很短,因此不值得担心时间复杂性,但是如果您还需要重复,这种技术可以获得对数性能