【问题标题】:How can I write a for loop for list? [closed]如何为列表编写 for 循环? [关闭]
【发布时间】:2014-01-24 12:28:48
【问题描述】:

我目前正在尝试为 list 编写一个循环。我的代码是:

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 循环?

【问题讨论】:

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

标签: c++ list function for-loop


【解决方案1】:

函数体周围有{}。实际上,您还需要在外循环主体周围使用它。

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

typename T::const_iterator it1;

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

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

我建议从these books 挑选。

【讨论】:

  • 我很惭愧我错过了那个>.>
  • 我认为{} 失踪是无意的
  • “列表不支持随机访问。” 那为什么推荐std::sort呢? :)
  • @P0W:如果这些构建破坏错误中的任何一个是故意的,那么 OP 就是 SOL AFAIAC。
  • @jrok:我不知道你在说什么! 口哨
【解决方案2】:

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

【讨论】:

  • 在这个函数的所有问题中,这个问题最少。
  • 问题指出编译失败,这就是它无法编译的原因。
  • 这确实是报告的四个错误中的两个的原因。
  • 它不能编译还有其他原因——更严重的原因。
  • 虽然我同意,但我认为它不值得反对。我也不相信编译错误有一定程度的严重性。无论如何,问题已被编辑,所有原始错误都已消失,因此很遗憾不再相关。
【解决方案3】:

大概你的真实代码包含了所有缺失的{},否则会出现更多错误。

T 似乎是容器类型,而不是值类型,因此迭代器类型将是 typename T::iterator;除了容器是const,所以你只能从中得到一个const_iterator。但是您的代码尝试修改容器,如果它是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

【讨论】:

  • 感谢明确指导,我刚开始编程,我的目的是实现list for i = 0, ... , n − 2 for j = 0, ... 的冒泡排序功能, n - i - 2 如果 aj+1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 2013-06-19
相关资源
最近更新 更多