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



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

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

附言:我在这个例子中使用的两种打印矢量元素的方法好吗?(两个用于回路(

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 << "nn";

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结尾的,它们不能打印为字符串。

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

是的,这是可能的。

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

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] = '';

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

这里像字符串一样打印它们:

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

使用null终止符还有一个额外的好处,即可以使用strlen((char*)buffer[0])随时了解数组的大小。

您需要向量上的data()方法。它将返回一个指向数据的指针,假设向量大小大于零。如果它为零,那么data()将返回一些,但使用它是未定义的。

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

最新更新