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<Token> 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 <<pos->getLineShow()<< pos->getLex()<<pos->getSem()<<endl;
pos++;//为什么pos++可以定位到下一个数组?
}
return 0;
}
output:The vector elements are:
1lexword
2lexword
在例子中通过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是迭代器
在对基类型取值的时候调用的是类型的迭代器
而迭代器的自增则是增加基类的大小
总结:
基类型指针的++运算符的作用
不是使这个指针指向地址自增1
而是使这个指针指向的对象的迭代器自增
C++中vector::data()使用心得和对自定义类型指针运算符的默认重载的更多相关文章
- [转]STL中vector转数组(实际是数组的指针)
感谢:http://topic.csdn.net/t/20050429/20/3976956.html 感谢:http://yzyanchao.blogbus.com/logs/47796444.ht ...
- c++中vector容器的功能及应用。
vector基本操作: 1.头文件 #include<vector>. 注:一定要加上using namespace std; 2.vector对象的创建: vector<int ...
- C++的STL中vector内存分配方法的简单探索
STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux CentOS 5.2 1.代码 #include <vector> #include <stdio ...
- vector data() [c++11]
Example 12345678910111213141516171819202122 // vector::data #include <iostream> #include <v ...
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code 1 2 template < class _Ty, cl ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
- excel 导入数据库 / SSIS 中 excel data source --64位excel 版本不支持-- solution
当本地安装的excel(2013版) 是64-bit时:出现的以下两种错误 解决: 1. excel 导入数据库 , 如果文件是2007则会出现:“The 'Microsoft.ACE.OLEDB.1 ...
- C++ 中vector的基本用法
//在网上看了好久,自己总结了一下下,第一篇博客,呼呼,学到不少 基本概念 vector容器是一个模板类,可以存放任何类型的对象).vector对象可以在运行时高效地添加元素,并且vector中元素是 ...
- 关于真机调试DDMS中的data文件夹打不开的解决方法
关于真机调试DDMS中的data文件夹打不开的解决方法 今天在开发的时候需要导出程序中的数据库文件查看数据,数据库文件默认就在/data/data/应用包名/databases/数据库名 这个路径下, ...
随机推荐
- linux中vim编辑器三种模式及常用命令的使用
Linux命令经常使用才会烂熟于心 命令行模式: 移动光标: 向下左右箭头可以移动光标: 将光标移动到行尾:$; 将光标移动到行头:^: 将光标移动到页尾:shift+g; 将光标移动到页头:1+sh ...
- js Array.prototype.slice.call(arguments,0) 理解
Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...
- Java中的常用的输入输出流
Java中的输入输出流根据格式又可以分为字节流和字符流:(成对) 字节流:FileInputStream,FileOutputStream : BufferedInputStream,Buffe ...
- Redis sentinel.conf配置文件详解
redis-sentinel.conf配置项说明如下: 1.port 26379 sentinel监听端口,默认是26379,可以修改. 2.sentinel monitor <master-n ...
- Linux之shell变量
一.变量名的规范 定义形如:class_name='xiaohemiao' 使用形如:echo $class_name 1.变量名后面的等号左右不能有空格 2.命名只能使用英文字母,数字和下划线,首个 ...
- JavaWeb项目中斜杠(/)表示web工程、webapps的场景
"/"代表当前web工程的常见应用场景 ①.ServletContext.getRealPath(String path)获取资源的绝对路径 /** * 1.ServletCont ...
- netty系列之:JVM中的Reference count原来netty中也有
目录 简介 ByteBuf和ReferenceCounted ByteBuf的基本使用 ByteBuf的回收 ByteBuf的衍生方法 ChannelHandler中的引用计数 内存泄露 总结 简介 ...
- 05.python语法入门--垃圾回收机制
# (1)垃圾回收机制GC# 引用计数# x = 10 # 值10引用计数为1# y = x # 值10引用计数为2## y = 1000 # 值10引用计数减少为1# del x # 值 ...
- Solution -「HNOI 2009」「洛谷 P4727」图的同构计数
\(\mathcal{Description}\) Link. 求含 \(n\) 个点的无标号简单无向图的个数,答案模 \(997\). \(\mathcal{Solution}\) 首先 ...
- Solution -「国家集训队」「洛谷 P4451」整数的 lqp 拆分
\(\mathcal{Description}\) Link. 求 \[\sum_{m>0\\a_{1..m}>0\\a_1+\cdots+a_m=n}\prod_{i=1}^mf ...