微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检索可以访问存储在std :: vector中的数组的所有元素的指针

如何解决检索可以访问存储在std :: vector中的数组的所有元素的指针

是否可以有一个指向向量使用的连续缓冲区的指针?

例如(请参阅下文),这里std::vector<unsigned char*> vec包含两个大小不同的unsigned char*指针。我需要有一个指向该向量中所有推送数据的缓冲区指针。我猜这是可能的,因为标准保证向量使用连续的内存缓冲区,对吧?

P.S。在此示例中使用的打印矢量元素的两种方式很好吗? (两个for循环)

unsigned char* data1 = new unsigned char[3];
data1[0] = 'a';
data1[1] = 'b';
data1[2] = 'c';


unsigned char* data2 = new unsigned char[1];
data2[0] = 'x';

std::vector<unsigned char*> vec;
vec.push_back(data1);
vec.push_back(data2);

for (size_t i = 0; i < vec.size(); i++) {
    std::cout << vec[i];
}

std::cout << "\n";

for (auto iter = vec.begin(); iter != vec.end(); iter++) {
    std::cout << (*iter);
}
std::cout << "\n\n";


unsigned char* buffer = (unsigned char*) vec[0];

buffer是否指向vec中的所有数据? buffer[0] = a,buffer[1] = b,buffer[2] = c,buffer[3] = x吗?

解决方法

buffer是否指向vec中的所有数据? buffer[0] = a,buffer[1] = b,buffer[2] = c,buffer[3] = x

不是。它指向存储在向量的第一个元素中的数组的开始。

在本示例中使用的两种打印矢量元素的方式还不错吗?

它们不是,这些数组不是以null终止的,它们不能打印为字符串。

是否可以有一个指向向量使用的连续缓冲区的指针?

是的,有可能。

如果您想要一个可以正确访问向量中所有数据的指针,包括您想要的无符号char数组成员的各个元素:

unsigned char **buffer = vec.data();

访问权限:

for(size_t i = 0; i < 3; i++)
    std::cout << buffer[0][i]; //indexing like a 2D array,albeit unbalanced
                                 //output: abc

std::cout << buffer[1][0]; //output: x

请注意,我使用循环来访问data1的每个元素,而不是简单地将其视为字符串,这是因为它不是字符串,也就是以null结尾的char数组。

不用说,您将需要知道每个数组中存储了多少个元素。

或者,您也可以将它们终止为空:

unsigned char* data1 = new unsigned char[4];
//...
data1[3] = '\0';

unsigned char* data2 = new unsigned char[2];
//...
data2[1] = '\0';

将它们像字符串一样打印:

std::cout << buffer[0];
std::cout << buffer[1];

使用空终止符的另一个好处是,您可以随时使用strlen((char*)buffer[0])来了解数组的大小。

,

您要在向量上使用data()方法。假设向量大小大于零,它将返回指向数据的指针。如果它为零,那么data()将返回某物,但是使用它是不确定的。

阅读https://en.cppreference.com/w/cpp/container/vector/data

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。