Code Bye

问一下C++中vector类型变量a,首地址是a.data()还是a.begin()

C++中vector类型变量a,首地址是a.data()还是a.begin()?

如图,为什么会出现“has no member “data””?

改为begin()后出现如图错误,问一下这是什么原因?
解决方案

3

这是一个vector容器
你为什么要扯上一个int*??
访问容器元素用迭代器

1

理解讨论之前请先学会怎么样观察
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建全部,然后在IDE中运行。(一般人本人不告诉他!
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或在某行按F9设了断点后按F5执行停在该断点处的时候。

10

a.begin()返回的是一个迭代器
a.data()返回的才是内部数组的首地址int*

10

data()是C++11后加的,你的编译器要支持C++11。

20

一般情况下用 begin,实在想要底层数据的地址用 data 或 &[0],同时小心别把容器弄挂了。

5

引用:

data()是C++11后加的,你的编译器要支持C++11。

同意

50

data() 是 C++11 新特性
不支持的话可以用
&vec[0]
&vec.at(0)
&vec.front()

不过好像相比data(),这些在vector为空时会抛异常或产生未定义行为

1

std::vector<int> a_int_vec;
for(auto it : a_int_vec)
{
    it = 9;
}
for(auto it : a_int_vec)
{
    std::cout<<it<<std::endl;
}
std::cout<<a_int_vec.data()<<std::endl;

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明问一下C++中vector类型变量a,首地址是a.data()还是a.begin()