我目前正在尝试为列表编写循环。我的代码是:
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循环?
答案 0 :(得分:6)
功能体周围有{}
个。事实上,你还需要在你的外环体周围。
您的迭代器类型也是错误的,因为T
是列表类型,而不是列表的元素类型。此外,它必须是const_iterator
,因为您通过const
引用传递了列表。
typename T::const_iterator it1;
最后,(it2)+1
和mylist.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
。