C++中vector::data()使用心得和对自定义类型指针运算符的默认重载
一、C++ vector::data()函数
返回值类型:vector的基类
返回值:Returns a pointer such that [data(), data() + size()] is a valid
range. For a non-empty %vector, data() == &front().
等价于:&vector::front()
例子
//基类型定义
class Token {
private:
int lineshow;
//记录该单词在原程序中的行数
string lex;
string sem;
public:
Token(int, string, string);
~Token();
int getLineShow() {
return this->lineshow;
}
string getLex() {
return this->lex;
};
string getSem() {
return this->sem;
}
};
//主函数
int main() {
// initialising vector
vector vec;
vec.push_back(Token(1, "lex","word"));
vec.push_back(Token(2, "lex","word"));
// memory pointer pointing to the
// first element
Token* pos = vec.data();
//Token* pos = &vec.front();
// prints the vector
cout << "The vector elements are: ";
for (int i = 0;
i < vec.size();
++i) {
cout getLex()
在例子中通过data()获得该数组对应类型的指针,指向该数组的首元素
其作用等价于 Token* pos = &vec.front();
并通过该指针对数组进行了遍历
在过程中有一个困惑 为什么pos++ 可以定位到数组中的下一个元素?
于是对代码进行了调试并查看pos++执行前后指针的内容
文章图片
文章图片
可见pos++不等价于pos+=1
而等价于 pos+=基类型的大小
由此引出下一个标题
C++对于++运算符的默认重载 直接上源码(节选)
json.h:
Value::ObjectValues::iterator current_;
SelfType& operator++() {
increment();
return *this;
}jsoncpp.cpp:
void ValueIteratorBase::increment() {
#ifndef JSON_VALUE_USE_INTERNAL_MAP
++current_;
#else
if (isArray_)
ValueInternalArray::increment(iterator_.array_);
ValueInternalMap::increment(iterator_.map_);
#endif
}
核心函数是incrument()
在其中是对current自增 而在json.h中定义了current是迭代器
在对基类型取值的时候调用的是类型的迭代器
而迭代器的自增则是增加基类的大小
总结:
【C++中vector::data()使用心得和对自定义类型指针运算符的默认重载】基类型指针的++运算符的作用
不是使这个指针指向地址自增1
而是使这个指针指向的对象的迭代器自增
推荐阅读
- vue2项目中封装echarts地图的优雅方法
- C++|C++ qt实现打开关闭状态按钮的代码
- 基于C++实现信息管理系统
- 详解C#枚举中使用Flags特性
- 三分钟学习一下JavaScript中map对象的用法
- 『德不孤』Pytest框架|『德不孤』Pytest框架 — 14、Pytest中的conftest.py文件
- Photoshop 2022 mac(PS2022)v23.2.1中文版
- 设计模式之【适配器模式】
- 逆波兰算法、中缀表达式转后缀表达式
- 面试官(Redis中的缓冲区了解吗)