我正在尝试将迭代器传递给一个单独的函数,然后对列表中该位置的元素执行某些操作。
这对我不起作用。
#include <list>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
void doSomething(iterator::<int> *it);
list<int> intList;
intList.push_back(10);
intList.push_back(20);
intList.push_back(10);
intList.push_back(30);
list<int>::iterator it;
for (it = intList.begin(); it != intList.end(); it++)
{
if (*it == '10')
doSomething(*it);
};
void doSomething(iterator <int> *it)
{
(*it) = 200;
};
}
答案 0 :(得分:3)
iterator
本身并不是一个独立的类型。它只是一个typedef(它可能不止于此。但我们可以安全地假设这个问题)
list<int>::iterator
是一个单独的类型,因此vector<int>::iterator
在层次结构中没有任何公共类。
接受iterator
的所有函数通常都是模板化函数,其中模板类型具有满足iterator要求的约束。
对于您的情况,您必须将doSomething
声明为:
void doSomething(list::iterator <int> it); // will only work with std::list iterators
或大多数STL函数/容器接受迭代器的方式
template<typename Iterator>
void doSomething(Iterator it); // generic. Will work with any container whose iterator has an overload for * operator
在任何一种情况下,你都可以打电话
for (it = intList.begin(); it != intList.end(); it++)
{
if (*it == 10)
doSomething(it);
};
答案 1 :(得分:1)
itetator
不会自动表示std::list
的迭代器。&
运算符(取地址)和一元*
运算符(取消引用)匹配类型。更正的代码(至少它编译):
#include <list>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
void doSomething(list<int>::iterator *it);
list<int> intList;
intList.push_back(10);
intList.push_back(20);
intList.push_back(10);
intList.push_back(30);
list<int>::iterator it;
for (it = intList.begin(); it != intList.end(); it++)
{
if (*it == '10')
doSomething(&it);
}
}
void doSomething(list<int>::iterator *it)
{
*(*it) = 200;
}
为了使这段代码更好:
10
而不是'10'
,可能是12592(0x3130)。请注意,多字符字符常量的值是实现定义的。代码似乎更好:
#include <list>
#include <iostream>
using namespace std;
void doSomething(list<int>::iterator &it);
int main(int argc, char *argv[])
{
list<int> intList;
intList.push_back(10);
intList.push_back(20);
intList.push_back(10);
intList.push_back(30);
list<int>::iterator it;
for (it = intList.begin(); it != intList.end(); it++)
{
if (*it == 10)
doSomething(it);
}
}
void doSomething(list<int>::iterator &it)
{
(*it) = 200;
}
答案 2 :(得分:0)
#include <list>
#include <iostream>
using namespace std;
void doSomething(list<int>::iterator *it)
{
*(*it) = 200;
}
int main(int argc, char *argv[])
{
list<int> intList;
intList.push_back(10);
intList.push_back(20);
intList.push_back(10);
intList.push_back(30);
list<int>::iterator it;
for (it = intList.begin(); it != intList.end(); it++)
{
if (*it == '10')
doSomething(&it);
}
}
请在main()之外创建doSomething函数。你在函数中的参数也是错误的。 iterator以某种方式充当typedef及其有点指针。您将ppointer作为参数传递,您需要使用此符号'&amp;'来获取指针的地址。
答案 3 :(得分:0)
最佳案例使用:
#include <list>
using namespace std;
template <typename T>
void doSomething(T it); /*Pre-condition: must be passed a dereferencible object.*/
int main(){
list<int> intList;
intList.push_back(10);
intList.push_back(20);
intList.push_back(10);
intList.push_back(30);
list<int>::iterator it;
for (it = intList.begin(); it != intList.end(); it++){
if (*it == 10) doSomething(it);
};
}
template <typename T>
void doSomething(T it){
(*it) = 200;
};