通过原始指针访问int的向量元素

时间:2016-12-01 15:27:51

标签: c++ vector stdvector

我想知道下面的代码是否合法。

基本上我有一个std::vector<int>,我有一个处理int数组的遗留函数。由于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

2 个答案:

答案 0 :(得分:7)

这不是一个黑客,而是100%合法(和预期)的矢量使用。在C ++ 11中,您的代码应该被重写以利用data()成员 - 这是为空向量定义的,与operator[]不同。

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

作为旁注,上述技术不适用于vector<bool>,因为后者不遵循常规向量的属性(这是一个可怕的想法,现在每个人都理解)。

答案 1 :(得分:2)

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

  

就像数组一样,矢量使用连续的存储位置   元素,这意味着他们的元素也可以使用   定期指向其元素的指针的偏移量,同样有效   在数组中。但与数组不同,它们的大小可以动态变化,   他们的存储由容器自动处理。

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

  

元素是连续存储的,这意味着元素可以   不仅可以通过迭代器访问,还可以使用常规偏移   指向元素的指针。这意味着指向一个元素的指针   vector可以传递给任何需要指针的函数   数组的元素。

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