C ++ List Iterator to Function

时间:2016-05-05 04:51:33

标签: c++ list iterator

我正在尝试将迭代器传递给一个单独的函数,然后对列表中该位置的元素执行某些操作。

这对我不起作用。

#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;
    };
}

4 个答案:

答案 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的迭代器。
  • 您无法在函数内定义函数: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;
}

答案 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;
};