如何为列表编写for循环?

时间:2014-01-24 12:28:48

标签: c++ list function for-loop

我目前正在尝试为列表编写循环。我的代码是:

template<typename T>
void Bubblesorting(list<T> & mylist)
{ 
    typename T::const_iterator it1;
    typename T::const_iterator it2;
    for(it1=mylist.begin();it1!=mylist.end();it1++)
        for(it2=mylist.begin();it2!=mylist.end()-(it1-begin());it2++)
            if((*(std::next(it2,1))<*it2)
                swap((*(std::next(it2,1)),*it2);
        cout << *it2 << ' ';
}

编译失败:

 error C2958: the left parenthesis '(' was not matched correctly

你能帮我查一下究竟是什么问题吗?我如何为列表元素写一个for循环?

3 个答案:

答案 0 :(得分:6)

功能体周围有{}个。事实上,你还需要在你的外环体周围。

您的迭代器类型也是错误的,因为T是列表类型,而不是列表的元素类型。此外,它必须是const_iterator,因为您通过const引用传递了列表。

typename T::const_iterator it1;

最后,(it2)+1mylist.end()-it1都不可能,因为列表不支持随机访问。您可以使用std::advance和朋友伪造它,但由于遍历列表非常重要(由于数据结构的设计),因此很难理解这一点。

总的来说,我会重新审视整个功能的概念。为什么不使用std::list::sort

我建议从these books中选择。

答案 1 :(得分:3)

除了缺少{}之外,您需要将迭代器定义为typename T::const_iterator it1;

答案 2 :(得分:1)

据推测,您的真实代码包含所有缺失的{},否则会出现更多错误。

T似乎是容器类型,而不是值类型,因此迭代器类型为typename T::iterator;除了容器为const,因此您只能获得const_iterator。但是你的代码试图修改容器,如果它是const则不可能。也许您想将参数复制到一个新容器中,然后对其进行排序和返回;或者你可能想要一个非const引用并对容器进行排序(不返回任何东西)。

您正尝试对不支持它们的迭代器类型执行随机访问操作。列表迭代器是双向 - 您可以递增它们并递减它们,但是您不能向它们添加任意数量,或者减去它们以给出距离。

使用像vector这样的随机访问容器可能更合适。或者,您可以将it+n替换为std::next(it,n),将it2-it1替换为std::distance(it1,it2)。 (或者,如果你坚持使用前C ++ 11库,请编写自己的这些函数版本。)

最后,it2!=mylist.end()-it1没有意义;左侧是距离,无法与迭代器进行比较。也许你想要end() - (it1-begin()),指的是距离it1最开始的位置。更有可能的是,您希望从it1迭代到end()-1