2016-12-01 91 views
1

我不知道下面的代碼是否合法。通過原始指針訪問整數向量的元素

基本上我有一個std::vector<int>和我有一個傳統的功能,處理int s的數組。由於std::vector的元素總是連續的,因此代碼應該始終有效(它實際上在我的實現中起作用),但對我來說它仍然有點破綻。

#include <vector> 
#include <iostream> 

void LecagyFunction(int *data, int length) 
{ 
    for (int i = 0; i < length; i++) 
    std::cout << data[i] << std::endl; 
} 

int main() 
{ 
    std::vector<int> vector; 
    vector.push_back(5); 
    vector.push_back(4); 
    vector.push_back(3); 
    LecagyFunction(&vector[0], vector.size()); 
} 

如預期的輸出是:

5 
4 
3 

回答

6

這不是一個劈,但向量的100%的法律(和預期的)的使用。在C++ 11中,您的代碼應該被重寫,以便利用data()成員 - 該成員是爲空向量定義的,與operator[]不同。

LecagyFunction(vector.data(), vector.size()); 

而作爲一個側面說明,上述技術不會爲vector<bool>工作,因爲後來不遵循常規向量的性質(一個可怕的想法,因爲現在每個人都明白)。

+1

C++ 11的方式不僅僅是「簡化」:與舊的方式不同,它甚至適用於空向量。 – Eugene

+0

@Eugene,同意。 – SergeyA

+0

@TartanLlama,原來的問題是關於整數,但我會澄清。謝謝。 – SergeyA

2

來自:http://www.cplusplus.com/reference/vector/vector/

就像陣列,載體使用他們 元件,這意味着它們的元素也可以使用在普通的指針 偏移到它的元素來訪問,並且只是作爲有效連續的存儲位置 在數組中。但與數組不同,它們的大小可以動態變化,其容量由容器自動處理。

來自:http://en.cppreference.com/w/cpp/container/vector

的元素被存儲連續的,這意味着元件可以 訪問不僅通過迭代器,而且還使用在普通 指針元件偏移。這意味着指向一個 向量元素的指針可以傳遞給任何期望指向數組元素的指針的函數。

所以是的,完全合法,並打算以這種方式工作。