一、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()使用心得和对自定义类型指针运算符的默认重载的更多相关文章

  1. [转]STL中vector转数组(实际是数组的指针)

    感谢:http://topic.csdn.net/t/20050429/20/3976956.html 感谢:http://yzyanchao.blogbus.com/logs/47796444.ht ...

  2. c++中vector容器的功能及应用。

    vector基本操作:  1.头文件 #include<vector>. 注:一定要加上using namespace std;  2.vector对象的创建: vector<int ...

  3. C++的STL中vector内存分配方法的简单探索

    STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux  CentOS 5.2 1.代码 #include <vector> #include <stdio ...

  4. vector data() [c++11]

    Example 12345678910111213141516171819202122 // vector::data #include <iostream> #include <v ...

  5. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

  6. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  7. excel 导入数据库 / SSIS 中 excel data source --64位excel 版本不支持-- solution

    当本地安装的excel(2013版) 是64-bit时:出现的以下两种错误 解决: 1. excel 导入数据库 , 如果文件是2007则会出现:“The 'Microsoft.ACE.OLEDB.1 ...

  8. C++ 中vector的基本用法

    //在网上看了好久,自己总结了一下下,第一篇博客,呼呼,学到不少 基本概念 vector容器是一个模板类,可以存放任何类型的对象).vector对象可以在运行时高效地添加元素,并且vector中元素是 ...

  9. 关于真机调试DDMS中的data文件夹打不开的解决方法

    关于真机调试DDMS中的data文件夹打不开的解决方法 今天在开发的时候需要导出程序中的数据库文件查看数据,数据库文件默认就在/data/data/应用包名/databases/数据库名 这个路径下, ...

随机推荐

  1. js 保存并排序输入内容

    转载请注明来源:https://www.cnblogs.com/hookjc/ /* Create By:jiangcheng_15 Create Date:2012-01-32 */ functio ...

  2. java创建自定义类的对象数组

      1 public class Student{ 2 static int number = 0; // 静态变量的访问可以不用创建类的实例就可就可使用< 类名.属性 >的方法访问 3 ...

  3. C++输入多行数据

    动机 编程题常用需求,比如输入两行数据. 解决思路:使用getline 程序 #include <iostream> #include <vector> #include &l ...

  4. numpy 知识汇总

    1.增加维度 高纬度打印出来很不好观察,所以打印出来shape更加容易理解维度的增加, 此外一维向量a=np.array([1,2,3]), a[:,None],相当于变为二维并转置了shape=(3 ...

  5. jquery-easyui环境的搭建及测试

    对于软件开发者来说,一个良好的前端框架不仅能够使页面优美可观而且还能够大大的提高开发效率.提高系统整体界面的美观,框架将常用的功能封装完成,减少工作量.前端框架目前也比较多,小编本次主要介绍下easy ...

  6. python数据分析之numpy、matplotlib的使用

    5.3 Python的科学计算包 - Numpy numpy(Numerical Python extensions)是一个第三方的Python包,用于科学计算.这个库的前身是1995年就开始开发的一 ...

  7. Linux基础:初识shell之系统命令基础

    一 shell介绍 shell Shell 中文意思贝壳,寓意类似内核的壳.Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,简而言之就是只要能够操作应用 ...

  8. 解决UIWebView内存不释放问题

    走访很多朋友,查阅了很多资料发现UIWebView这尼玛就是个坑,有人说是sdk自带的bug....... 所以一个新的方法诞生了#import <WebKit/WebKit.h> WKW ...

  9. MyBatis分页插件PageHelper使用方法

    1.导入相关依赖坐标 <!-- MyBatis分页插件 --> <dependency> <groupId>com.github.pagehelper</gr ...

  10. 音视频开发者的福音,快速集成AI配音能力

    音视频内容创作者对剪辑应用中的AI配音需求与日俱增.它的优点很多,不光可以解决雇佣人力配音的成本以及创作者本身的口音.语言等限制,还可以大幅提升生产效率.比如,短视频的播放时间短的几十秒,长的vlog ...