[英]C++ array and vector dynamic item size
我想我還是不了解C ++容器和數組的局限性。 根據這篇文章和這個 ,不可能在STL向量中存儲動態大小的項目。
但是,使用下面的代碼,我可以動態地重新定義向量的元素,如果可以在向量中具有變化和改變大小的項目,則可以預期結果。
string test = "TEST";
vector<string> studentsV;
for (int i = 0; i < 5; ++i)
{
studentsV.push_back(test);
}
studentsV[2].resize(100);
for (string s : studentsV)
{
cout << s << "end" << endl;
}
結果:
TESTend
TESTend
TEST
end
TESTend
TESTend
我可以將字符串元素的大小重新調整為任何大小,並且它可以正常工作。 我也可以使用常規的C風格數組。 那么,上面的帖子和我正在做的事情之間有什么區別,你能舉一個“動態項目大小”真正含義的例子,因為顯然我不理解。
std::string
使用動態內存來增加存儲的字符串的大小。 這不是那些文章所談論的內容。
他們的意思是, sizeof(std::string)
是不變的。 表示std::string
的實際對象將始終具有相同的大小,但它可能會在內存的另一部分中執行其他分配。
std::vector
實際上只是一個動態大小的數組的友好包裝器。 C或C ++中數組的定義是一個連續的內存塊,其中所有元素的大小相等。
你能給出一個“動態項目大小”真正含義的例子嗎,因為顯然我不理解。
這是您問題的核心。
即:如果所有C ++類(甚至那些管理動態內存作為其實現的一部分)通過sizeof()
具有固定且已知的占用空間大小......那么你不能放入std的是什么類型的東西: :向量?
因為像std::string
和std::bitset
這樣的類是不同大小的類,所以你不能有[string string bitset string bitset string]的向量。 但類型系統已經不允許你這樣做了。 所以這不是他們所說的。
他們只是說從C世界支持這樣的結構是沒有的:
struct packetheader {
int id;
int filename_len;
};
struct packet {
struct packetheader h;
char filename[1];
};
你不能創建一個std::vector<packet>
並期望找到一些push_back
參數,讓你指定每個項目的大小。 您將丟失在結構邊界之外分配的任何數據。
所以要使用類似的東西,你必須做std::vector<packet*>
並存儲指針。
std::string
的大小不是動態的。 std::string
可能是用指向動態分配內存的指針實現的。 這使得sizeof(std::string)
靜態的,並且可能與實際字符串的大小不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.