关于c++中iterator进行遍历与普通的for循环进行遍历的疑问

vector<int> vec[1111];

void DFS(int i)
{
visit[i]=1;
vector<int>::iterator it;
for(it=vec[i].begin();it!=vec[i].end();it++)
if(visit[*it]==0)
DFS(*it);
/*
for(int i=1;i<=P;i++)
{
if(visit[i]==0)
{
DFS(i);
}
}
}

这是我代码中抽出来的一部分,我使用iterator进行遍历时正确的,使用简单的for循环是错误的,
这里的visit[]数组是标记无向图中的顶点是否被访问过 P是顶点数目

我的这个dfs想实现的是 判断这个无向图是否为欧拉图(还未判断奇点)

第1个回答  2014-04-07
// 你的 i 变量是形参呀,这个 DFS 函数就是去遍历 vec[i] 这个数组的,修改如下
int nLen = vec[i].size();
for (int j = 0; j < nLen; j ++)
{
    if (visit[vec[i][j]] == 0)
    {
        DFS(vec[i][j]);
    }
}

本回答被提问者和网友采纳
第2个回答  2014-03-25
其实很简单,就是循环次数的问题,用int i 可能会导致索引超出int 的表示范围,从而导致错误!而使用迭代器就不会产生这样的问题了!
第3个回答  2014-03-25
你可以输出调试信息,或者写日志看看为什么不一样

关于c++中iterator进行遍历与普通的for循环进行遍历的疑问
\/\/ 你的 i 变量是形参呀,这个 DFS 函数就是去遍历 vec[i] 这个数组的,修改如下int nLen = vec[i].size();for (int j = 0; j < nLen; j ++){ if (visit[vec[i][j]] == 0) { DFS(vec[i][j]); }} ...

c++iterator
C++中的iterator是一种抽象概念,用于遍历容器中的元素。它是一种类似于指针的对象,可以指向容器中的元素并进行访问和操作。通过迭代器,我们可以方便地对容器中的元素进行遍历、插入和删除等操作。一、迭代器的概念 在C++中,迭代器是一种模板类,它提供了一种通用的方式来访问和遍历容器中的元素。迭代...

什么是C++的迭代器Interator?
C++中的iterator为STL中的重要概念。iterator的概念源自于对遍历一个线性容器工具的抽象,即如何你能访问这个容器的某个元素。对于最简单的数组,当然可以用数组的索引值,因为数组是连续存放在内存中的;但对于链表,就必须用指针。除此之外,还有还有很多种数据结构需要提供一个方便的工具来访问其中的元素...

c++ iterator
在C++标准库中,迭代器(iterator)是编程中的一个重要概念,它让你能够遍历和操作容器中的元素,就像在链表(例如,`#include ` 和 `#include ` 后,使用 `list` 的例子)中进行操作一样。它本质上类似于指针,但使用方式和声明方式与普通指针有着显著差异。迭代器提供了一种通用的方式来处理容器中...

为什么在C++中vector string对象不能直接输出,需要自己遍历,然后逐个...
一个原因是标准库不知道怎样才是最合适的输出方式,比如每个元素间要不要用回车分隔,还是用逗号分隔,再说即使不能直接输出,写起来也很简单,如果是C++11的话,写成 for (auto&& i:text) cout << i <<' ';就可以了 真的需要cout << text;这种写法的话,自己重载一个 operator<< 函数也是很...

c++ STL迭代器(iterator)
迭代器通常有三种使用方式:常规遍历、C++11的begin()和end()工具函数,以及通过容器提供的获取方法获取迭代器[6]。算法如sort()等,接受迭代器作为参数,提升了开发效率[7]。并非所有STL容器都支持迭代器,容器适配器如list和forward_list不支持,它们提供了统一接口但不直接支持[8]。迭代器失效是常见...

问一个stl的map遍历的问题
两种方式iterator遍历的次数是相同的,但在STL中效率不同,前++--返回引用,后++--返回一个临时对象,因为iterator是类模板,使用it++这种形式要返回一个无用的临时对象,而it++是函数重载,所以编译器无法对其进行优化,所以每遍历一个元素,你就创建并销毁了一个无用的临时对象。不信的话你可以去看看...

c++ 中,我想用iterator库函数中的begin和end函数遍历一个数组,不知道错...
std::begin()和std::end()是C++11新特性,注意你的编译器是否支持 此外用C++11auto类型做迭代比较好

vector的几种遍历方式
特别要注意的是,当使用迭代器进行遍历时,特别是在进行erase操作并可能涉及到边界调整时,务必谨慎处理,以防止出现越界错误。为了更安全地操作,推荐使用C++11引入的区间迭代或其他新特性。总的来说,无论是从代码清晰度、可维护性还是性能角度看,for-range都是vector遍历的优选方法。在实际编程中,结合...

C++中用vector存放一个数组,对数组进行排序,并输出数组
text.push_back(word);} 什么时候跳出循环?for(vector<string>::iterator iter=text.begin();iter!=text.end();++iter)sort(text.begin(),text.end());sort一次就可以了,循环迭代的目的什么?cout<<*iter<<endl;for循环结束后,iter指向text.end(), 里面不包含有效数据, *iter是会抛出异常...

相似回答