【问题标题】:Error in an iterator for a deque双端队列的迭代器中的错误
【发布时间】:2014-03-14 16:08:48
【问题描述】:
int CardDeck::inOrder(){
    deque<int>::const_iterator i;
    for (i = nameofdeque.begin(); i != nameofdeque.end(); ++i){ 
            if (nameofdeque[i] >= nameofdeque[i+1]){
            return 0;
        }
    }   
    return 1;
 }

此代码在第 4 行给出错误提示“CardDeck.cpp:37: error: expected type-specifier before '[' token CardDeck.cpp:37:: 参数太多。

我想知道如何解决这个问题。 我试过“if(nameofdeque.at(i) >= nameofdeque.at(i+1){” 但无济于事。

非常感谢任何帮助, 谢谢!

【问题讨论】:

    标签: c++ iterator deque


    【解决方案1】:

    迭代器不是双端队列的索引,你使用*i来访问它指向的成员。

    【讨论】:

      【解决方案2】:

      在您的代码中,i 是一个迭代器,而不是一个索引(整数)。 operator[] 需要索引(整数)作为参数。

      【讨论】:

        【解决方案3】:

        operator[] 采用 size_t 即一个索引,但您将迭代器传递给它。如果你想用迭代器来做,那么把第 4 行改成这个

        if (*i >= *(i+1)) {
        

        为避免这种混淆,迭代器通常命名为iter,而不是用于循环索引或下标的常用标识符i

        如果您真的想在没有迭代器但使用索引的情况下执行此操作,那么您可以将函数更改为

        int CardDeck::inOrder() {
            for (size_t i = 1u; i < nameofdeque.size(); ++i) {
                if (nameofdeque[i - 1] >= nameofdeque[i]) {  // you cannot do this for the first element, hence the loop's variable starts at 1 to offset this
                    return 0;
                }
            }   
            return 1;
         }
        

        【讨论】:

        • 您的循环将有越界访问。
        • 谢谢,现在修好了 :)
        • 您没有考虑到双端队列大小可能为 0 :-)
        • 我确实考虑到了;它本质上是正确处理的。请注意,i 将是 0 并且条件 0 &lt; 0 将是 false 因此跳过 for 并返回 1 即 inOrder = true 对于单个元素双端队列是预期的:)
        • 好发现!啊,我把你的评论误认为是 1 大小写了 :) 现已修复!
        猜你喜欢
        • 2013-06-03
        • 1970-01-01
        • 2015-06-26
        • 2019-10-07
        • 2017-05-20
        • 2015-07-18
        • 2010-10-29
        • 2010-12-12
        • 1970-01-01
        相关资源
        最近更新 更多