C++ 使用std::vector作为字符缓冲区

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[]缓冲区。我做了以下工作:

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";