C++ 使用std::vector作为字符缓冲区
我想使用std::vector作为char[]缓冲区。我做了以下工作:C++ 使用std::vector作为字符缓冲区,c++,buffer,stdvector,C++,Buffer,Stdvector,我想使用std::vector作为char[]缓冲区。我做了以下工作: std::vector<char> buffer; buffer.push_back('2'); buffer.push_back('5'); buffer.push_back('6'); std::cout << buffer.data() << "\n"; buffer.clear(); buffer.push_back('3'); std::cout << buffer.
std::vector<char> buffer;
buffer.push_back('2');
buffer.push_back('5');
buffer.push_back('6');
std::cout << buffer.data() << "\n";
buffer.clear();
buffer.push_back('3');
std::cout << buffer.data() << "\n";
我想要的是:
256
3
我猜std::vector::clear不会修改底层指针
请给我一个解决方案。这个主意很好。问题不是很清楚,它不起作用,而是你打印的向量错误 buffer.data返回一个指向数据的指针,换句话说就是一个字符*。当您在char*上使用std::cout时,它需要一个以nul结尾的字符串,即C样式的字符串,但您没有这样做,因为数据中没有nul字符,因此会得到不可预测的结果 下面是一些使用std::copy和std::ostreambuf_迭代器以正确方式打印向量的代码
这个主意很好。问题不是很清楚,它不起作用,而是你打印的向量错误 buffer.data返回一个指向数据的指针,换句话说就是一个字符*。当您在char*上使用std::cout时,它需要一个以nul结尾的字符串,即C样式的字符串,但您没有这样做,因为数据中没有nul字符,因此会得到不可预测的结果 下面是一些使用std::copy和std::ostreambuf_迭代器以正确方式打印向量的代码
您的代码具有未定义的行为;最后应该添加空终止符“\0”以使用std::vector as。e、 g
您的代码具有未定义的行为;最后应该添加空终止符“\0”以使用std::vector as。e、 g 输出不带空终止符的char[]缓冲区的另一种方法是使用write,而不是输出不带空终止符的char[]缓冲区的另一种方法是使用write而不是std::copy+std::ostreambuf_迭代器。对于这种情况,std::copy+std::ostreambuf_迭代器有点过头了。
256
3
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
std::vector<char> buffer;
buffer.push_back('2');
buffer.push_back('5');
buffer.push_back('6');
std::copy(buffer.begin(), buffer.end(), std::ostreambuf_iterator(std::cout));
std::cout << std::endl;
buffer.clear();
buffer.push_back('3');
std::copy(buffer.begin(), buffer.end(), std::ostreambuf_iterator(std::cout));
std::cout << std::endl;
return 0;
}
std::vector<char> buffer;
buffer.push_back('2');
buffer.push_back('5');
buffer.push_back('6');
buffer.push_back('\0');
std::cout << buffer.data() << "\n";
buffer.clear();
buffer.push_back('3');
buffer.push_back('\0');
std::cout << buffer.data() << "\n";