如何在c ++中声明Iterator的堆栈集

时间:2014-01-04 16:51:14

标签: c++ stl iterator stack set

我正在创建一个堆栈的类。我想使用迭代器来获取结尾的元素并访问它的函数。但是我收到以下错误

setOfStacks.cpp:40:6: error: expected ';' after expression
            set< stack<Type> >::iterator it = mSetOfStacks.end();
               ^
               ;

该类使用模板,并按此声明

template<typename Type>
class SetOfStacks 
{
public: 
        SetOfStacks(int capacityPerStack);
    void            push(Type object);
    Type            pop();
    bool            isEmpty();
private:
    void            createNewStackWithElem(Type object);
private:

        int                 mStackCapacity;
        set<stack<Type> >   mSetOfStacks;
};

然后在我的插入函数中,我尝试在最后得到堆栈

set< stack<Type> >::iterator it = mSetOfStacks.end();
if( *it->size() < mStackCapacity )
    *it->push(object);

这是我在尝试声明迭代器时遇到错误的地方 setOfStacks.cpp:40:6:错误:预期';'表达后

另外,我试过

set<stack<Type> >::iterator it = mSetOfStacks.end(); 

但它无效

整个推送功能

template<typename Type>
void SetOfStacks<Type>::push(Type object) {
    // if entire set is empty make a new stack
    if( mSetOfStacks.empty() ) {
        stack<Type> newStack;
        newStack.push(object);

        mSetOfStacks.insert(newStack);
    }
    else {
        // check if current stack within limits
        set< stack<Type> >::iterator it = mSetOfStacks.end();
        if( *it->size() < mStackCapacity )
            *it->push(object);
        else {
            // duplicate code, make another function
            stack<Type> newStack;
            newStack.push(object);

            mSetOfStacks.insert(newStack);
        }
    }
}

3 个答案:

答案 0 :(得分:3)

在函数模板中,嵌套名称iterator是一个从属名称,它被认为是一个对象而不是一个类型。您想使用iterator关键字指明typename是一种类型:

typename std::set<std::stack<Type> >::iterator it = mSetOfStacks.end();
// ^-- here

模板分两个阶段进行解析:在第一阶段,代码被解析为其逻辑组件,而不知道模板参数或实体,具体取决于模板参数的外观。如果根据模板参数存在嵌套名称,则编译器会假定此名称是对象而不是类型,除非您明确声明它是使用typename关键字的类型。

答案 1 :(得分:1)

auto是完美的关键字:

auto it = mSetOfStacks.end();

答案 2 :(得分:1)

使用C ++ 11时,您不需要指定迭代器类型来在从mSetOfStacks.end()之类的内容初始化时定义迭代器。您可以改为使用auto

auto it = mSetOfStacks.end();

此外,您不应该访问此迭代器,因为它指向一个元素超过结束。如果你想要集合中的最后一个元素,在访问它之前递减迭代器:

--it;
// then use *it

或使用引用变量引用最后一组:

auto & lastSet = *(--it);
// then use lastSet instead of *it

如果您的编译器不支持auto,请使用Dietmar的解决方案。