• 抬起头,继续前进吧,去把这个不完美的故事,变成你成所期望的样子
  • 登山路上我们会放弃很多东西,但这些被我们丢掉在我们登上山顶之际,都会一一回来
  • 不论开发还是逆向,数学水平的高低直接决定了”你的饭碗里有没有肉”
  • 万丈高楼平地起,勿在浮沙筑高台

C++实现自定义容器类通过迭代器iterator进行元素访问

C++ 菜鸟 8个月前 (11-26) 6022次浏览 已收录 0个评论

一、前言

其实 C++的迭代器,细细一想就是对指针的封装,既然本质是指针,那我们也来简单的动手做一下吧。
环境: VS 2017

二、实践

我们先在自定义容器类 CArray 里定义一个iterator 类型

typedef T1 * iterator;

容器都有 begin(), end()分别来获取第一个元素和尾元素的下一个位置,我们也给自定义容器类 CArray 加上这两个成员函数
函数实现如下:

template<typename T1>
inline CArray<T1>::iterator CArray<T1>::begin() const noexpect
{
    return m_paArray;
}

template<typename T1>
inline CArray<T1>::iterator CArray<T1>::end() const noexpect
{
    return m_paArray + m_uiCurrentElementsNum;
}

编译不通过,报错如下:
warning C4346: “iterator”: 依赖名称不是类型
note: 用“typename”为前缀来表示类型
error C2061: 语法错误: 标识符“iterator”
error C2143: 语法错误: 缺少“;”(在“{”的前面)

这是为什么呢? 其实是由于菜鸟的自定义类是一个类模板,虽然加上了作用域 CAarray::,
但在类还没有生成实现代码时,编译器不认识这个 iterator 是什么,也不会将它当成一个类型。
它已经贴心提示我们加上 typename 前缀来表示类型,还是很智能呢:)
修改如下:

template<typename T1>
inline typename CArray<T1>::iterator CArray<T1>::begin()
{
    return m_paArray;
}

template<typename T1>
inline typename CArray<T1>::iterator CArray<T1>::end()
{
    return m_paArray + m_uiCurrentElementsNum;

}

测试代码:

CArray<int> arrayInt = { 5, 8, 1, 3, 9 };

printf("Elements of arrayInt: \r\n");
for (auto itorI = arrayInt.begin(); itorI != arrayInt.end(); ++itorI)
{
    printf("%d ", *itorI);
}
printf("\r\n");

arrayInt.SelectSort(1);

printf("Elements of arrayInt: \r\n");
for (const auto &Element : arrayInt)
{
    printf("%d ", Element);
}
printf("\r\n");

编译成功,由于实现了 begin()和 end(),也能使用 for(… : …)语法了。测试结果如下:
Elements of arrayInt:
5 8 1 3 9
Elements of arrayInt:
5 1 3 8 9

三、小结

        有时一些新技术新名词出现的很快,你可能想着要学的东西很多觉得很烦躁,其实这些大多数都是在基础上拓展出来的,只要基础打牢,对新的东西自然理解就快,同时还能举一反三。
        比如,C++11 新的 cbegin()和 cend(),也就是在之前的基础上多个 const,篇幅有限这里不实现啦,大家有兴趣也可以自己动手做做。那今天就这样啦,Happy Coding^_^


学习心得 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++实现自定义容器类通过迭代器 iterator 进行元素访问
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址