首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:获取std::vector的起始地址?

C++:获取std::vector的起始地址?
EN

Stack Overflow用户
提问于 2010-04-28 17:36:33
回答 4查看 2.9K关注 0票数 6

有时,使用std::vector的起始地址并将该地址临时视为定期分配的缓冲区的地址是很有用的。

例如,替换为:

代码语言:javascript
复制
 char* buf = new char[size];
 fillTheBuffer(buf, size);
 useTheBuffer(buf, size);
 delete[] buf;

有了这个:

代码语言:javascript
复制
 vector<char> buf(size);
 fillTheBuffer(&buf[0], size);
 useTheBuffer(&buf[0], size);

这样做的好处当然是缓冲区是自动释放的,我不必担心delete[]

我遇到的问题是当大小为== 0时。在这种情况下,第一个版本可以正常工作。一个空的缓冲区被“分配”,随后的函数不做任何事情,它们的大小为== 0。

但是,如果size ==为0,则第二个版本会失败,因为调用buf[0]可能会正确地包含0 < size断言。

那么,有没有一种方法可以替代习惯用法&buf[0],即使向量为空也可以返回向量开始的地址?

我也考虑过使用buf.begin(),但根据标准,它甚至不能保证返回一个指针。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-28 17:45:37

我想你只需要检查一下。

也许是一个实用函数:

代码语言:javascript
复制
template <class T, class Alloc>
T* data(std::vector<T, Alloc>& vec)
{
    return vec.empty() ? 0 : &vec[0];
}

template <class T, class Alloc>
const T* data(const std::vector<T, Alloc>& vec)
{
    return vec.empty() ? 0 : &vec[0];
}
票数 8
EN

Stack Overflow用户

发布于 2010-04-28 17:47:23

没有这个函数,即使std::basic_stringdata()可以做你需要的事情。

你必须使用像buf.size()?&buf[0]:0;这样的东西

票数 1
EN

Stack Overflow用户

发布于 2010-04-29 00:52:39

我认为无论哪种情况,你都应该是安全的。我认为vector::operatorint和vector::at(int)之间的不同之处在于,[]运算符重载并不专门执行边界检查。使用buf应该没有断言!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2728255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档