簡體   English   中英

檢索可以訪問存儲在 std::vector 中的所有數組元素的指針

[英]Retrieve pointer that can acess all the elements of arrays stored in a std::vector

是否可以有一個指向向量使用的連續緩沖區的指針?

例如(請參見下文),這里std::vector<unsigned char*> vec包含兩個不同大小的unsigned char*指針。 我需要一個指向這個向量中所有推送數據的緩沖區指針。 我猜這是可能的,因為標准保證向量使用連續的內存緩沖區,對嗎?

PS 打印我在這個例子中使用的向量元素的兩種方式好嗎? (兩個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

它沒有。 它指向存儲在向量第一個元素中的數組的開始。

我在這個例子中使用的兩種打印向量元素的方法好嗎?

它們不是,這些數組不是空終止的,它們不能作為字符串打印。

是否可以有一個指向向量使用的連續緩沖區的指針?

是的,這是可能的。

如果您想要一個可以正確訪問向量中所有數據的指針,包括您想要的 unsigned 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每個元素,而不是簡單地將其data1字符串,這是因為它不是字符串,也就是空終止字符數組。

不用說,您需要知道每個數組中存儲了多少個元素。

或者,您可以空終止它們:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM