如何在 C++ 中为堆栈集声明迭代器
how to declare Iterator for set of stacks in c++
我正在创建一个作为一组堆栈的类。我想使用迭代器在最后获取元素并访问其函数。但是我收到以下错误
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 的解决方案。
相关文章:
- 将在堆栈上声明的元素添加到静态数组
- 何时在函数中声明堆栈分配变量?
- 此函数如何更改堆栈上声明的变量的值?
- 删除堆栈上声明的对象
- 您如何声明类型结构的堆栈?在C 中
- OpenCV C++:声明一个新变量会导致堆栈损坏
- 程序在函数声明时崩溃,出现未经处理的异常:堆栈溢出
- C :删除在堆栈上声明的结构的字段
- C#到C代码P/调用多个std:字符串声明导致堆栈损坏
- 如何在 C++ 中为堆栈集声明迭代器
- 在堆栈 C++ 上声明固定大小的字符数组
- 堆栈变量或函数声明
- 当我声明一个大小为500 x 500的双精度矩阵时,为什么会出现堆栈溢出
- C++ 中的动态堆栈数据类型声明
- 如何在C++11中声明堆栈引用
- 声明空堆栈的最有效方法是什么
- 错误 C2244:"堆栈:<T>:运算符=":无法将函数定义与现有声明匹配
- 在结构定义内部声明结构的堆栈
- 声明大数组时堆栈/堆溢出
- 在堆栈上声明大数组