我只想检查迭代器是否指向列表中的对象。
什么是cmd?
谢谢。 :)
SkyThe
编辑:
嗯,好吧,我试过了。 现在有一个错误:“Expression:list iterators incompitable”也许有些代码:
#include <list>
list<obj> list;
list<obj>::iterator it;
if(it != list.end()){ //here the error pops up when i debug
vShowStatus();
}else{
cout << "...";
}
答案 0 :(得分:6)
你做不到。没有办法检查。您必须构造代码,以便迭代器位于list.begin()和list.end()之间。
以这种方式使用迭代器:
for (std::list<int>::const_iterator it = myList.begin(); it != myList.end(); ++it)
cout << *it << " ";
您无法将[ EDIT ]列表迭代器与关系运算符(&lt;,&gt;,&lt; =,&gt; =)进行比较,因此当您在for循环外使用迭代器时,然后你必须总是通过比较begin()(如果你向后用--it)或者用end()(如果你继续使用++)来检查你是否超出界限。
std::list<int>::const_iterator it = ... // initialized with some CORRECT value
// going backward
while (true)
{
cout << *it;
if (it == list.begin())
break;
--it;
}
// going forward
while (true)
{
cout << *it;
++it;
if (it == list.end())
break;
}
// or simplier
while (it != list.end())
{
cout << *it;
++it;
}
如果由于某种原因,您确实需要检查,那么您可以遍历列表并检查是否有任何迭代器与您的迭代器相同。但这可能会对性能产生相当大的影响,因此只能在调试或/和测试中使用它。
答案 1 :(得分:1)
恩示例:
vector<int> the_vector;
vector<int>::iterator the_iterator;
for( int i=0; i < 10; i++ ) the_vector.push_back(i);
int total = 0;
the_iterator = the_vector.begin();
while( the_iterator != the_vector.end() ) {
total += *the_iterator;
++the_iterator;
}
cout << "Total=" << total << endl;
答案 2 :(得分:1)
关于未初始化的迭代器(24.1.5),标准有这个说法:
迭代器也可以有单数 与之无关的值 任何容器。例如,之后 未初始化的声明 指针
x
(与int* x;
一样),x
必须 总是假设有一个单数 指针的值。结果最多 表达式未定义为单数 值;唯一的例外是 将非奇异值赋值给 一个包含单数的迭代器 值。在这种情况下,奇异值 被覆盖的方式与任何方式相同 其他价值。
所以,不。因为你可以用未初始化(或无效的)迭代器做的唯一事情是使它成为一个有效的迭代器,所以没有办法测试你是否有一个。始终初始化您声明的迭代器(也限制您使用它们的范围),并确保在无效操作后不继续使用迭代器。
但是,编译器的SC ++ L的特定实现可能会跟踪未初始化的迭代器,并且如果您使用迭代器执行非法操作,则会抛出您所看到的类型的错误。但这绝不是一个保证的结果。
答案 3 :(得分:0)
if (it!=collection.end()) std::cout << "Iterator points to data" << std::endl;
else std::cout << "Iterator does not point to data" << std::endl;
答案 4 :(得分:0)
那里有一个未初始化的迭代器。我认为没有办法测试它是否未初始化。 (始终初始化变量以避免此问题。)
您可以通过将初始化迭代器与相同列表的结束迭代器进行比较来确定已初始化迭代器是否指向列表中的内容。