我想使用std :: vector来动态分配内存.场景是:
int neededLength = computeLength(); // some logic here
// this will allocate the buffer
std::vector<TCHAR> buffer( neededLength );
// call a function that accepts TCHAR* and the number of elements
callFunction( &(buffer[0]), buffer.size() );
Run Code Online (Sandbox Code Playgroud)
上面的代码有效,但这&(buffer[0])看起来很难看.是否有更优雅的方式来实现相同的目标?
小智 24
没人知道这真是奇怪!在C++ 11中你可以使用:
buffer.data()
Run Code Online (Sandbox Code Playgroud)
它可以得到我测试它的向量的地址:
vector<char>buffer;
buffer.push_back('w');
buffer.push_back('h');
buffer.push_back('a');
buffer.push_back('t');
buffer.push_back('\0');
char buf2[10];
memcpy(buf2,buffer.data(),10);
Run Code Online (Sandbox Code Playgroud)
规格在这里.
小智 20
好吧,你可以删除一组parens:
&buffer[0]
Run Code Online (Sandbox Code Playgroud)
但这是常见的,惯用的方式.如果真的冒犯了你,我想你可以使用一个模板 - 比如:
template <typename T>
T * StartOf( std::vector <T> & v ) {
return &v[0];
}
Run Code Online (Sandbox Code Playgroud)
sbi*_*sbi 19
实际上,&buffer[0](注意没有parantheses)的主要问题并不是它不是真的很漂亮.(无论如何,这是主观的.buffer.begin(), buffer.end()当我第一次学会使用STL时,我记得发现并不漂亮.)
主要问题是它在buffer空的时候调用未定义的行为- 大多数代码从不检查它.这就是我将这些放入我的工具箱的原因:
template <class T, class TAl>
inline T* begin_ptr(std::vector<T,TAl>& v)
{return v.empty() ? NULL : &v[0];}
template <class T, class TAl>
inline const T* begin_ptr(const std::vector<T,TAl>& v)
{return v.empty() ? NULL : &v[0];}
template <class T, class TAl>
inline T* end_ptr(std::vector<T,TAl>& v)
{return v.empty() ? NULL : (begin_ptr(v) + v.size());}
template <class T, class TAl>
inline const T* end_ptr(const std::vector<T,TAl>& v)
{return v.empty() ? NULL : (begin_ptr(v) + v.size());}
Run Code Online (Sandbox Code Playgroud)
使用这些,您可以将代码编写为
callFunction( begin_ptr(buffer), buffer.size() );
Run Code Online (Sandbox Code Playgroud)
是否begin_ptr(buffer)比&buffer[0]您留下的更漂亮.但是,鉴于NULL应该检查每个指针函数参数,它肯定更安全.
Kon*_*lph 12
但这
&(buffer[0])看起来很难看
这是正常的方式.但是,您可以省略括号:
&buffer[0]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27842 次 |
| 最近记录: |