[英]C++ List Iterator to Function
我試圖將迭代器傳遞給單獨的函數,然后對列表中該位置的元素進行處理。
這對我不起作用。
#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;
};
}
iterator
本身不是獨立類型。 它只是一個typedef(可能不止於此。但是對於這個問題,我們可以放心地假設是這樣)
list<int>::iterator
是一個單獨的類型, vector<int>::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);
};
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;
}
#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函數。 同樣,您在函數中的參數是錯誤的。 迭代器以某種方式用作typedef及其種類的指針。 您將ppointer作為參數傳遞,您需要使用帶有符號'&'的指針地址。
最佳用例:
#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;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.