2016-12-01 115 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

的元素被存储连续的,这意味着元件可以 访问不仅通过迭代器,而且还使用在普通 指针元件偏移。这意味着指向一个 向量元素的指针可以传递给任何期望指向数组元素的指针的函数。

所以是的,完全合法,并打算以这种方式工作。