2014-01-24 63 views
-3

我目前正在尝试为列表编写一个循环。我的代码是:如何为列表编写for循环?

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循环列表的元素?

+1

列表迭代器不是随机访问,因此'+'运算符不起作用,并且您正在传递对const容器的引用,同时试图在方法内对其进行变异。 – bobah

回答

6

函数体在它们周围有{}。事实上,你还需要围绕外部循环的主体。

您的迭代器类型也是错误的,因为T是列表类型,而不是列表的元素类型。此外,它将需要是const_iterator,因为您通过const参考的列表。

typename T::const_iterator it1; 

最后,既不(it2)+1也不mylist.end()-it1是可能的,因为列表不适合随机存取。你可以用std::advance和朋友来伪造它,但是由于遍历一个列表并不重要(因为数据结构的设计),所以这很困难。

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

我建议从these books挑选。

+2

我很惭愧地说我错过了>> – Borgleader

+0

我认为'{}'丢失是无意的 – P0W

+0

*“列表不支持随机访问。”*那么为什么推荐'std :: sort'呢? :) – jrok

3

除了丢失{}你需要定义你的迭代器为typename T::const_iterator it1;

+0

在这个功能的所有问题中,这是最不成问题的。 – Puppy

+0

这个问题指出编译失败,这就是为什么它不能编译。 –

+1

这确实是四个报告错误中两个的原因。 –

1

推测,你的真实代码包含所有缺少的{},否则会有更多的错误。

T看起来是容器类型,而不是值类型,所以迭代器类型是typename T::iterator;除了容器是const,所以你只能得到一个const_iterator。但是你的代码试图修改容器,如果它是const,这是不可能的。也许你想将参数复制到一个新的容器中,并对其进行排序并返回;或者您可能想要使用非const引用并对容器进行排序(不返回任何内容)。

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

也许使用像vector这样的随机存取容器更合适。或者,也许您可​​以用std::next(it,n)it2-it1替换it+nstd::distance(it1,it2)。 (或者,如果您遇到预C++ 11库,请编写您自己的这些函数版本。)

最后,it2!=mylist.end()-it1没有意义;左边是一个距离,不能与迭代器进行比较。也许你想end() - (it1-begin()),指的是远离尾端的位置,因为it1是从头开始的。更有可能的是,你想从it1重复end()-1

+0

感谢您的明确指导,我刚刚开始编程,我的目的是实现列表对于i = 0,...,n - 2 对于j = 0,...,n - 我 - 2 如果aj +1 user3140486