std::vector、字符 * 和 C API
std::vector, char *, and C API
我想使用一些需要 char
缓冲区的 C API,我正在考虑使用 std::vector
作为支持缓冲区。我现在的想法是
- 获取C需要的大小API
- 创建一个向量并相应地保留其大小
- 将向量提供给 C API
- 获取C写入的字节数API
- 相应地调整矢量大小
下面的代码概述了这个想法:
int main(){
auto required_size = get_required_buffer_size();
auto buffer = std::vector<char>{};
buffer.resize(required_size);
auto read_size = read_data(std::data(buffer), buffer.capacity());
buffer.resize(read_size);
}
这是 std::vector
的正确用法,还是我搬起石头砸自己的脚?
编辑:将 reserve
更改为 resize
,因为最后一个 resize
将覆盖 read_data
写入的数据
你所拥有的非常接近,但它可以使用一些细微的变化:
auto buffer = std::vector<char>{};
buffer.resize(required_size);
可以减少到
std::vector<char> buffer(required_size);
并且buffer.capacity()
需要是required_size
或buffer.size()
。
int main(){
auto required_size = get_required_buffer_size();
std::vector<char> buffer(required_size);
auto read_size = read_data(buffer.data(), buffer.size());
buffer.resize(read_size);
}
也就是说,在需要 char[]
缓冲区的情况下,我更喜欢使用 std::string
代替:
int main(){
auto required_size = get_required_buffer_size();
std::string buffer(required_size, '[=13=]');
auto read_size = read_data(buffer.data()/*or: &buffer[0]*/, buffer.size());
buffer.resize(read_size);
}
我想使用一些需要 char
缓冲区的 C API,我正在考虑使用 std::vector
作为支持缓冲区。我现在的想法是
- 获取C需要的大小API
- 创建一个向量并相应地保留其大小
- 将向量提供给 C API
- 获取C写入的字节数API
- 相应地调整矢量大小
下面的代码概述了这个想法:
int main(){
auto required_size = get_required_buffer_size();
auto buffer = std::vector<char>{};
buffer.resize(required_size);
auto read_size = read_data(std::data(buffer), buffer.capacity());
buffer.resize(read_size);
}
这是 std::vector
的正确用法,还是我搬起石头砸自己的脚?
编辑:将 reserve
更改为 resize
,因为最后一个 resize
将覆盖 read_data
你所拥有的非常接近,但它可以使用一些细微的变化:
auto buffer = std::vector<char>{};
buffer.resize(required_size);
可以减少到
std::vector<char> buffer(required_size);
并且buffer.capacity()
需要是required_size
或buffer.size()
。
int main(){
auto required_size = get_required_buffer_size();
std::vector<char> buffer(required_size);
auto read_size = read_data(buffer.data(), buffer.size());
buffer.resize(read_size);
}
也就是说,在需要 char[]
缓冲区的情况下,我更喜欢使用 std::string
代替:
int main(){
auto required_size = get_required_buffer_size();
std::string buffer(required_size, '[=13=]');
auto read_size = read_data(buffer.data()/*or: &buffer[0]*/, buffer.size());
buffer.resize(read_size);
}