当前位置:网站首页>vector::data() 指针使用细节
vector::data() 指针使用细节
2022-06-27 09:11:00 【wangzai6378】
我们可以使用std::vector<T>::data() 返回的指针做内存操作,但需要一些细节。比如
#include<iostream>
#include<iterator>
#include<vector>
int main(int argc, char **argv)
{
std::vector<int> dss;
dss.reserve(2);
int eeee[2]{11, 22};
::memcpy(dss.data(), eeee, sizeof(eeee));
std::copy(dss.begin(), dss.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}测试一下,你会发现没有任何输出。
原因是memcpy是纯内存拷贝,数据其实已经拷贝进去了,但是vector的size并没有因为我们拷贝做合适的调整,所以我们访问vector的时候是一个empty(),是访问不到的。改成如下
#include<iostream>
#include<iterator>
#include<vector>
int main(int argc, char **argv)
{
std::vector<int> dss;
dss.reserve(2);
int eeee[2]{11, 22};
::memcpy(dss.data(), eeee, sizeof(eeee));
std::copy(dss.begin(), dss.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
auto p = dss.data();
for (int i = 0; i < sizeof(eeee) / sizeof(int); i++)
{
std::cout << p[i] << " ";
}
std::cout << std::endl;
return 0;
}此时你会发现有数据了,证实了数据是真的拷贝进去了的。找清原因后,我们也可以使用vector::resize函数来初始化空间,同时更改vector的可访问size大小
#include<iostream>
#include<iterator>
#include<vector>
int main(int argc, char **argv)
{
std::vector<int> dss;
dss.resize(2);
int eeee[2]{11, 22};
::memcpy(dss.data(), eeee, sizeof(eeee));
std::copy(dss.begin(), dss.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}这样也有输出了。
需要提醒的是,下面这样是不行的
#include<iostream>
#include<iterator>
#include<vector>
int main(int argc, char **argv)
{
std::vector<int> dss;
dss.reserve(2);
int eeee[2]{11, 22};
::memcpy(dss.data(), eeee, sizeof(eeee));
dss.resize(2);
std::copy(dss.begin(), dss.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}此处,先开空间,然后拷贝,再修改大小,看似行得通,其实不然。先开空间2个int,然后拷贝;再resize时,由于此时vector的size仍是0(拷贝数据并没有修改其size),调用时空间大小是2,不会重新分配空间,但是目前size是0,会从0开始默认填充2个0做为默认元素,此时size也变成了2。这个用例你会发现输出结果全是0。
总结,使用刚初始化的vector的data()返回指针,向其拷贝数据的时候,必须先保证其空间和size大小,调用resize即可;也可以先调用reserve,再调用push_back,这个就不是操作指针拷贝了。
边栏推荐
- ServletConfig and ServletContext
- Correctly understand MySQL mvcc
- Digital ic-1.9 understands the coding routine of state machine in communication protocol
- Fake constructor???
- Improving efficiency or increasing costs, how should developers understand pair programming?
- Understand neural network structure and optimization methods
- 【生动理解】深度学习中常用的各项评价指标含义TP、FP、TN、FN、IoU、Accuracy
- Process 0, process 1, process 2
- C# 解决使用SQLite 的相对路径问题
- 经典的一道面试题,涵盖4个热点知识
猜你喜欢

Object contains copy method?

Semi supervised learning—— Π- Introduction to model, temporary assembling and mean teacher

Rough reading DS transunet: dual swing transformer u-net for medical image segmentation

C# 解决使用SQLite 的相对路径问题

Analysis of orthofinder lineal homologous proteins and result processing

(original) custom drawable

浏览器的markdown插件显示不了图片
Shortcut key bug, reproducible (it seems that bug is the required function [funny.Gif])

有关二叉树的一些练习题

ucore lab5
随机推荐
E+H二次表维修PH变送器二次显示仪修理CPM253-MR0005
Several cases that do not initialize classes
RMAN-08137 主库无法删除归档文件
针对直播痛点的关键技术解析——首帧秒开、清晰度、流畅度
ucore lab3
When multiple network devices exist, how to configure their Internet access priority?
ucore lab4
[ 扩散模型(Diffusion Model) ]
数字IC-1.9 吃透通信协议中状态机的代码编写套路
Tips for using Jupiter notebook
ThreadLocal再次挖掘它的知识点
Internal class ~ lock ~ access modifier
Process 0, process 1, process 2
IO管脚配置和pinctrl驱动
Apache POI的读写
Rough reading DS transunet: dual swing transformer u-net for medical image segmentation
ThreadLocal digs its knowledge points again
I'm almost addicted to it. I can't sleep! Let a bug fuck me twice!
即构「畅直播」,全链路升级的一站式直播服务
MySQL proficient-01 addition, deletion and modification