如何在 C++ 中为堆栈集声明迭代器

how to declare Iterator for set of stacks in c++

本文关键字:堆栈 声明 迭代器 C++      更新时间:2023-10-16

我正在创建一个作为一组堆栈的类。我想使用迭代器在最后获取元素并访问其函数。但是我收到以下错误

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);
        }
    }
}

在函数模板中,嵌套名称iterator是一个依赖名称,它被视为对象而不是类型。您希望使用 typename 关键字指示iterator是类型:

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

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

auto

完美的关键字:

auto it = mSetOfStacks.end();

使用 C++11 时,在从类似 mSetOfStacks.end() 初始化迭代器时,无需指定迭代器类型来定义迭代器。您可以改用auto

auto it = mSetOfStacks.end();

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

--it;
// then use *it

或使用引用变量引用最后一个集合:

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

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