std::vector: vec.data() or &vec[0]
std::vector: vec.data() or &vec[0]
当你想访问一个 std::vector 作为 C 数组时,你可以从至少四种不同的方式中进行选择,如你在这个例子中看到的:
#include <iostream>
#include <vector>
using namespace std;
int main() {
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(42);
vec.push_back(24024);
{
int* arr = vec.data();
cout << arr << endl; /* output: 0x9bca028 */
cout << arr[3] << endl; /* output : 24024 */
}
{
int* arr = &vec.front();
cout << arr << endl; /* output: 0x9bca028 */
cout << arr[3] << endl; /* output : 24024 */
}
{
int* arr = &vec[0];
cout << arr << endl; /* output: 0x9bca028 */
cout << arr[3] << endl; /* output : 24024 */
}
{
int* arr = &vec.at(0);
cout << arr << endl; /* output: 0x9bca028 */
cout << arr[3] << endl; /* output : 24024 */
}
}
在大多数情况下,我发现的是&vec[0]
。我认为这是最不优雅的,所以...为什么它是最常用的?是更高效还是更兼容?我找不到很多关于data()
的文档.
data()
对C++11来说是全新的,这就是为什么你不经常看到它。 我甚至从未想过使用&vec.front()
的想法,可能是因为我使用operator[]
的频率比front()
高得多(几乎从不)。 我想其他人也是如此。
如果您使用的是C++11,那么使用data()
绝对是可取的。 特别是,如果向量为空,则使用其他两个选项中的任何一个都会产生未定义的行为! 如果您没有使用 C++11,并且向量可能为空,请务必检查该条件。
使用 &vec[0] 是最常见的,尽管我同意,看起来确实有点奇怪。未来要记住的一件事。如果你的向量恰好是对象的向量,其类重载了运算符&(),请注意,如果你调用 &vec[0],这将导致奇怪的行为。
这不会获取内部连续对象数组中第一项的起始地址,它将返回任何 vec[0].operator&() 将返回的内容。大多数(如果不是全部)这不是您要查找的地址(绝地挥手)。
一个很好的例子是ATL的CComPtr。它重载运算符&(),因此将其存储在向量中可能会有问题。为了解决这个问题,ATL有一个CAdapt模板类,可用于隐藏CComPtr上的运算符&()
在 C++11 std::array
之前,我会说 std::vector
是最常用的容器,而不是 C 样式数组。[]
运算符通常意味着恒定时间访问(这就是std::vector
的全部内容),因此大多数编码人员通常选择这种样式来反映类似数组的访问和行为。
()已经成为std::string
的一部分已经有一段时间了,所以你可以阅读它。我发现 std::vector
中的 data() 实现是相似的。我偶尔会使用 data() 将std::string
视为原始字节数组。
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 模式"allocate memory or use existing data"
- N-API include an .so or dll
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 将 OR 逻辑运算符从 C++ 转换为 Fortran
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 我如何将 OR 与 if 语句一起使用字符串
- 将 if 语句中的字符与 or 进行比较
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- "No such file or directory" C++标头问题
- 处理 std::enable_if<...中谓词的逻辑"OR">
- Omnet++中的.vec和.sca输出有什么区别?
- C++ 虽然语句不适用于字符串和"or"
- vec[i][j] 是否转换为 *(vec + i + j)?
- std::vector: vec.data() or &vec[0]