簡體   English   中英

是否保證std :: vector元素是連續的?

[英]Are std::vector elements guaranteed to be contiguous?

我的問題很簡單:std :: vector元素是否保證是連續的? 用命令的話,我可以將指向std :: vector的第一個元素的指針用作C數組嗎?

如果我的記憶對我有用,則C ++標准沒有做出這樣的保證。 但是,std :: vector要求如此,如果元素不連續,則幾乎不可能滿足它們。

有人可以澄清嗎?

例:

std::vector<int> values;
// ... fill up values

if( !values.empty() )
{
    int *array = &values[0];
    for( int i = 0; i < values.size(); ++i )
    {
        int v = array[i];
        // do something with 'v'
    }
}

適當的C ++ 98標准缺少此功能,但后來將其添加為TR的一部分。 當然,即將到來的C ++ 0x標准將包含此要求。

從n2798(C ++ 0x草案)起:

23.2.6類模板向量[vector]

1向量是支持隨機訪問迭代器的序列容器。 另外,它在末尾支持(攤銷)恆定時間插入和擦除操作。 在中間插入和擦除需要線性時間。 存儲管理是自動處理的,盡管可以提供一些提示以提高效率。 向量的元素是連續存儲的,這意味着如果v是向量,其中T是非bool的某種類型,則它對所有0 <= n <v都服從&v [n] ==&v [0] + n的標識。尺寸()​​。

正如其他答案所指出的那樣,向量的內容保證是連續的(布爾的怪異除外)。

我要添加的注釋是,如果對向量進行插入或刪除,這可能導致向量重新分配其內存,那么您將導致所有保存的指針和迭代器無效。

實際上,該標准確實確保了vector在內存中是連續的,並且&a[0]可以傳遞給需要數組的C函數。

這個規則的例外是vector<bool> ,每個bool僅使用一位,因此盡管它確實具有連續的內存,但不能用作bool* (這被廣泛認為是錯誤的優化和錯誤)。

順便說一句,為什么不使用迭代器? 那就是他們的目的。

正如其他人已經說過的, vector內部使用連續的對象數組。 每當將任何非常量成員函數稱為IIRC時,應將該數組中的指針視為無效。

但是,有一個例外!

vector<bool>具有旨在節省空間的專門實現,因此每個布爾僅使用一位。 底層數組不是bool的連續數組,並且vector<bool>上的數組算法無法像vector<T>那樣工作。

(我想向量的任何特殊化也可能是正確的,因為我們總是可以實現一個新的std::vector<bool> 。但是, std::vector<bool>是唯一的,錯誤的,標准的特殊化,簡單指針運算將基於此進行。工作。)

我找到這個線程是因為我有一個用例,其中使用連續內存的向量是一個優勢。

我正在學習如何在OpenGL中使用頂點緩沖區對象。 我創建了一個包裝器類來包含緩沖區邏輯,因此我要做的就是傳遞一個浮點數數組和一些配置值來創建緩沖區。 我希望能夠根據用戶輸入從函數生成緩沖區,因此在編譯時長度未知。 做這樣的事情將是最簡單的解決方案:

void generate(std::vector<float> v)
{
  float f = generate_next_float();
  v.push_back(f);
}

現在,我可以將向量的浮點作為數組傳遞給OpenGL的與緩沖區相關的函數。 這也消除了使用sizeof確定數組長度的需要。

這遠比分配一個巨大的數組來存儲浮點數並希望我做得足夠大,或者使自己的動態數組具有連續存儲要好得多。

是的,保證std :: vector的元素是連續的。

cplusplus.com:

向量容器被實現為動態數組。 就像常規數組一樣,向量容器將其元素存儲在連續的存儲位置中,這意味着它們的元素不僅可以使用迭代器進行訪問,還可以使用元素的常規指針上的偏移量進行訪問。

暫無
暫無

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

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