簡體   English   中英

C ++數組和向量動態項目大小

[英]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::stringstd::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.

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