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 <getLineShow()<< pos->getLex()<getSem()<

在例子中通过data()获得该数组对应类型的指针,指向该数组的首元素
其作用等价于 Token* pos = &vec.front();
并通过该指针对数组进行了遍历

在过程中有一个困惑 为什么pos++ 可以定位到数组中的下一个元素?

于是对代码进行了调试并查看pos++执行前后指针的内容
image

image
可见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()使用心得和对自定义类型指针运算符的默认重载)