以旧方式C++遍历对象指针数组(没有基于范围的 for)
Iterating through array of object pointers in C++ the old way (without range-based for)?
我并不精通C++,但我得出了以下代码:
BaseManager* allManagers[] =
{
mColorManager,
mToolManager,
mLayerManager,
mPlaybackManager,
mViewManager
};
for ( BaseManager* pManager : allManagers )
{
pManager->setEditor( this );
pManager->init();
}
我使用较旧的g++,所以我不能使用-std=c++11
,我必须使用-std=c++0x
。错误地查看"老式"等效项:":"标记之前的预期初始值设定项,我希望以下内容能够起作用:
for ( auto it = allManagers.begin(); it != allManagers.end(); ++it )
{
BaseManager* pManager = *it;
pManager->setEditor( this );
pManager->init();
}
。但它失败了:
error: request for member ‘begin’ in ‘allManagers’, which is of non-class type ‘BaseManager* [5]’
error: unable to deduce ‘auto’ from ‘<expression error>’
所以我收集了,因为这个allManagers
显然只是一个 C 数组,它不是一个带有方法的对象(如 .begin
) - 所以最后,我终于得到了那段编译:
for ( int i=0 ; i<5 ; i++ )
{
BaseManager* pManager = allManagers[i];
pManager->setEditor( this );
pManager->init();
}
。但是,这需要我手动写入数组长度,这是我不喜欢的。
所以,我的问题是:在不使用基于范围的 for 循环的情况下遍历这样一个指针数组的正确方法是什么 - 而且,也不必显式输入硬编码数组长度?
您可以使用:
for ( auto it = std::begin(allManagers); it != std::end(allManagers); ++it )
{
但是,这些也是 C++11 功能。某些 C++11 之前的编译器可能支持它们,但不能保证。
如果没有 C++11 编译器,您可以使用:
size_t numObjects = sizeof(allManagers)/sizeof(allManagers[0]);
for ( size_t i = 0; i < numObjects; ++i )
{
BaseManager* manager = allManagers[i];
要么跟踪变量中的数组长度,要么使用 std::array 或 std::vector。
编辑:如果你想创建自己的ArrayLen()方法,你可以这样做:
template<class T, size_t Size>
static inline size_t ArrayLen(const T(&arr)[Size])
{
return Size;
}
然后你可以这样做:
for(size_t i = 0; i < ArrayLen(allManagers); ++i)
{
BaseManager * pManager = allManagers[i];
allManagers
不是容器。它是一个指针数组,因此您不能使用 .begin()
.
如果要确定数组的大小,只需执行以下操作:
int n = sizeof(allManagers)/sizeof(allManagers[0]);
查看此问题以获取更多信息。请注意,您的数组位于堆栈中。
相关文章:
- 为什么我的变量存在于其范围之外
- set_intersection范围范围
- 满足标准::范围::范围概念
- 向量向量的范围范围
- C++参数类型以接受适用于基于范围的 for 循环的所有序列
- 代码具有特定于函数的变量,用于更改范围之外的值
- 将自适应阈值应用于范围函数 opencv c++
- 用辅助方法范围范围的问题来操纵字符串
- C++:将参数应用于函数范围
- C++11:用容器参数定义函数(类似于基于范围的)
- 在C /STL中,是否有相当于Python范围()的紧凑型
- 用于循环范围范围
- 如何制作增强多指数复合范围语句,等效于x和y
- std::copy_n 是否适用于重叠范围?
- 依赖于模板参数的范围查找
- 标准算法 any_of()、all_of() 和 none_of() 应用于空范围
- 常数,但仅适用于此范围的剩余部分
- 确定谓词是否适用于一个范围的全部、部分或全部元素
- 延长临时的生命周期,适用于块范围的聚合,但不是通过"新";为什么?
- 矢量超出范围/范围检查