簡體   English   中英

C ++列表迭代器功能

[英]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迭代器。
  • 您不能在函數內部定義函數:GCC擴展僅適用於C,不適用於C ++。
  • 使用一元&運算符(地址)和一元*運算符(取消引用)來匹配類型。

更正的代碼(至少可以編譯):

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM