有时,使用std::vector的起始地址并将该地址临时视为定期分配的缓冲区的地址是很有用的。
例如,替换为:
char* buf = new char[size];
fillTheBuffer(buf, size);
useTheBuffer(buf, size);
delete[] buf;有了这个:
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(),但根据标准,它甚至不能保证返回一个指针。
发布于 2010-04-28 17:45:37
我想你只需要检查一下。
也许是一个实用函数:
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];
}发布于 2010-04-28 17:47:23
没有这个函数,即使std::basic_string有data()可以做你需要的事情。
你必须使用像buf.size()?&buf[0]:0;这样的东西
发布于 2010-04-29 00:52:39
我认为无论哪种情况,你都应该是安全的。我认为vector::operatorint和vector::at(int)之间的不同之处在于,[]运算符重载并不专门执行边界检查。使用buf应该没有断言!
https://stackoverflow.com/questions/2728255
复制相似问题