C++ C+中整数向量的序列化/反序列化+; 要完成的任务

C++ C+中整数向量的序列化/反序列化+; 要完成的任务,c++,optimization,serialization,C++,Optimization,Serialization,我试图将整数向量序列化为字符串,以便将其存储到文件中。所使用的方法是将整数逐字节复制到缓冲区中。为此,我使用了std::copy\n函数 为了反序列化,我做了同样的反向操作,即从缓冲区逐字节复制一个整数,并将这些整数附加到向量 我不确定这是否是实现这一目标的最佳/最快方法 代码 序列化函数 char*序列化(向量nums) { char*buffer=(char*)malloc(sizeof(int)*nums.size()); 向量::迭代器i; int j; 对于(i=nums.begin(

我试图将整数向量序列化为字符串,以便将其存储到文件中。所使用的方法是将整数逐字节复制到缓冲区中。为此,我使用了std::copy\n函数

为了反序列化,我做了同样的反向操作,即从缓冲区逐字节复制一个整数,并将这些整数附加到向量

我不确定这是否是实现这一目标的最佳/最快方法

代码 序列化函数
char*序列化(向量nums)
{
char*buffer=(char*)malloc(sizeof(int)*nums.size());
向量::迭代器i;
int j;
对于(i=nums.begin(),j=0;i!=nums.end();i++,j++=4){
拷贝n(i,4,缓冲器+j);
}
返回缓冲区;
}
反序列化函数 向量反序列化(char*str,int len) { int-num; 向量ret; 对于(int j=0;j 关于如何改进这段代码的任何输入都将非常有用。我还想知道实现同样目标的其他方法

但我不确定这是否是实现这一目标的最佳/最快方式

深呼吸

最简单的问题有最复杂的答案

可以说,实现这一点的最简单方法是将整数作为十进制数字进行流式处理。如果文件的可读性对您很重要,那么这是“最好的”

从程序员的角度来看,您所采用的方法是最简单的,但它没有试图满足不同系统上整数的不同位表示。因此,在您想在另一台机器上读回该文件之前,它是很简单的,在这一点上,它会成为一个令人头痛的问题

还请注意,上述两种方法都不节省空间。当涉及到I/O时,更短的时间总是更快,在写入数据之前和读取数据之后处理数据所花费的时间与传输或存储数据所花费的时间相比都是微不足道的

如果实际的I/O性能和可移植性对你很重要(他们可能是),那么你可能需要考虑一个合适的编码方案。 Zig-Zag编码是一种既可移植又高效的方案。它的工作原理是,我们在生活中遇到的大多数整数往往比INT_MAX更接近于零

您开始使用的一些链接:

但我不确定这是否是实现这一目标的最佳/最快方式

深呼吸

最简单的问题有最复杂的答案

可以说,实现这一点的最简单方法是将整数作为十进制数字进行流式处理。如果文件的可读性对您很重要,那么这是“最好的”

从程序员的角度来看,您所采用的方法是最简单的,但它没有试图满足不同系统上整数的不同位表示。因此,在您想在另一台机器上读回该文件之前,它是很简单的,在这一点上,它会成为一个令人头痛的问题

还请注意,上述两种方法都不节省空间。当涉及到I/O时,更短的时间总是更快,在写入数据之前和读取数据之后处理数据所花费的时间与传输或存储数据所花费的时间相比都是微不足道的

如果实际的I/O性能和可移植性对你很重要(他们可能是),那么你可能需要考虑一个合适的编码方案。 Zig-Zag编码是一种既可移植又高效的方案。它的工作原理是,我们在生活中遇到的大多数整数往往比INT_MAX更接近于零

您开始使用的一些链接:


你的方法有很多问题

char *serialize(vector <int> nums)
{
    char *buffer = (char *)malloc(sizeof(int)*nums.size());
    vector <int>::iterator i;
    int j;
    for(i = nums.begin(), j = 0; i != nums.end(); i++, j += 4) {
        copy_n(i, 4, buffer+j);
    }
    return buffer;
}
这些函数的接口遵循标准库中设置的约定,并且非常灵活,您可以使用它来序列化文件(使用
std::fstream
)或字符串(使用
std::stringstream


你的方法有很多问题

char *serialize(vector <int> nums)
{
    char *buffer = (char *)malloc(sizeof(int)*nums.size());
    vector <int>::iterator i;
    int j;
    for(i = nums.begin(), j = 0; i != nums.end(); i++, j += 4) {
        copy_n(i, 4, buffer+j);
    }
    return buffer;
}
这些函数的接口遵循标准库中设置的约定,并且非常灵活,您可以使用它来序列化文件(使用
std::fstream
)或字符串(使用
std::stringstream


如果您想查看已经运行的代码,请将此问题发布在“请”。@πάνταῥεῖ 我不想让它成为代码审查。编辑了这个问题。谢谢你的意见!你能确切地解释一下这个问题为什么不是一个代码审查的请求,你的工作代码是如何在各个方面得到优化的吗?那代码有效吗?(就像在《做你期望的事?》中一样)我认为最快的方法是直接写入文件。如果你想查看已经在运行的代码,请将这个问题发布到@πάνταῥεῖ 我不想让它成为代码审查。编辑了这个问题。谢谢你的意见!你能确切地解释一下这个问题为什么不是一个代码审查的请求,你的工作代码是如何在各个方面得到优化的吗?那代码有效吗?(就像在做你想做的吗?)我想最快的方法就是直接写到文件中。谢谢你的回复。人类可读性不是必需的,我想将整数作为字节写入文件。我不明白这种方法在I/O方面的速度有多慢。你能进一步解释一下吗?谢谢你的回复。人类可读性不是必需的,我想将整数作为字节写入文件。我不明白这种方法在I/O方面有多慢,您能进一步解释一下吗?
char *serialize(vector <int> nums)
{
    char *buffer = (char *)malloc(sizeof(int)*nums.size());
    vector <int>::iterator i;
    int j;
    for(i = nums.begin(), j = 0; i != nums.end(); i++, j += 4) {
        copy_n(i, 4, buffer+j);
    }
    return buffer;
}
template<typename POD>
std::ostream& serialize(std::ostream& os, std::vector<POD> const& v)
{
    // this only works on built in data types (PODs)
    static_assert(std::is_trivial<POD>::value && std::is_standard_layout<POD>::value,
        "Can only serialize POD types with this function");

    auto size = v.size();
    os.write(reinterpret_cast<char const*>(&size), sizeof(size));
    os.write(reinterpret_cast<char const*>(v.data()), v.size() * sizeof(POD));
    return os;
}

template<typename POD>
std::istream& deserialize(std::istream& is, std::vector<POD>& v)
{
    static_assert(std::is_trivial<POD>::value && std::is_standard_layout<POD>::value,
        "Can only deserialize POD types with this function");

    decltype(v.size()) size;
    is.read(reinterpret_cast<char*>(&size), sizeof(size));
    v.resize(size);
    is.read(reinterpret_cast<char*>(v.data()), v.size() * sizeof(POD));
    return is;
}
std::vector<int> v = {1, 2, 3, 500, 900};

std::stringstream oss; // this could just as well be a `std::fstream` 

if(serialize(oss, v))
{
    std::vector<int> n;
    if(deserialize(oss, n))
    {
        for(auto i: n)
            std::cout << i << '\n';
    }
}
1
2
3
500
900