我想知道下面的代码是否合法。
基本上我有一个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
答案 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可以传递给任何需要指针的函数 数组的元素。
所以是的,完全合法并打算以这种方式工作。