C++ 指向所有std::vector元素的指针
从代码可读性和语义来看,获得指向所有std::vector元素的指针的最佳方法是什么,这样它就可以像通常的数组一样使用?我曾经用过:C++ 指向所有std::vector元素的指针,c++,arrays,std,c++03,C++,Arrays,Std,C++03,从代码可读性和语义来看,获得指向所有std::vector元素的指针的最佳方法是什么,这样它就可以像通常的数组一样使用?我曾经用过: void Func( int* ) ... std::vector<int> x(1000); Func(&(x[0])); void Func(int*) ... std::向量x(1000); Func(&(x[0])); 但我想知道有没有更漂亮的方法?x、 begin()返回向量::迭代器。
void Func( int* )
...
std::vector<int> x(1000);
Func(&(x[0]));
void Func(int*)
...
std::向量x(1000);
Func(&(x[0]));
但我想知道有没有更漂亮的方法?x、 begin()返回向量::迭代器。
&x.front()
x.data()
或C++03中的&x.front()
除了Dave的答案之外,您可以省去括号:
int * xP = &x[0];
除了Dave的答案,你可以省去括号:
int * xP = &x[0];
你也可以这样写:
int*xp=&x.front()
,但是没有最佳的解决方案,你写的所有东西都应该由编译器优化成相同的结果。你也可以这样写:int*xp=&x.front()
,但是没有最佳的解决方案,编译器应将您编写的所有内容优化为相同的结果。向量保证在C++11中有连续的存储空间,在vc++6.0到vc++2012的平台中也有连续的存储空间。向量保证在C++11中有连续的存储空间,在vc++6.0到vc++2012的平台中也有连续的存储空间。听起来像您正在做的事情这不是很漂亮吗。你真的需要把这两者混合起来吗?如果代码调用向量上的assign
或resize
,会发生什么情况?可能会使您的指针无效。@Component10同意,我不知道他的用例,但通常需要这样做的原因是与遗留API交互。()@Component10,这主要是关于函数调用的。只能将指针指定给无法更改向量大小的函数:)@klm123:最好将指针作为函数调用的参数获取(如myFunc(&x.front(),…)
),而不是将其存储在变量中。这样,如果发生重新分配(取决于您对向量所做的操作),您将永远不会有过期的指针变量。@John,据我所知,向量在C++03中保证有连续存储。弦是没有这种保证的。资料来源:Scott Meyers的“有效STL”,第16项:“知道如何将向量和字符串数据传递给legacyAPIsSounds,就像你正在做的那样,这并不是很好。你真的需要把这两者混合起来吗?如果代码调用向量上的assign
或resize
,会发生什么情况?可能会使您的指针无效。@Component10同意,我不知道他的用例,但通常需要这样做的原因是与遗留API交互。()@Component10,这主要是关于函数调用的。只能将指针指定给无法更改向量大小的函数:)@klm123:最好将指针作为函数调用的参数获取(如myFunc(&x.front(),…)
),而不是将其存储在变量中。这样,如果发生重新分配(取决于您对向量所做的操作),您将永远不会有过期的指针变量。@John,据我所知,向量在C++03中保证有连续存储。弦是没有这种保证的。来源:Scott Meyers的“有效STL”,第16项:“知道如何将向量和字符串数据传递给LegacyApisy您也可以像使用常规数组一样执行&x[0]
。您也可以执行&x[0]
,就像使用常规数组一样。在C++11之前,std::vector
已经有了连续的存储空间。在这方面,std::string是混乱的。在C++11之前,std::vector
已经有了连续的存储空间。在这方面是混乱的std::string
。