转换一个向量并将其写入 C++ stringstream

Cast a vector and write it in a C++ stringstream

在下面的玩具程序中,我使用 stringstream 写入和读取双精度向量。但是,我如何在 ss 中将 v 写为(舍入)uint 的向量,以便当 w 读取程序的输出是3?

#include <sstream>
#include <vector>
#include <iostream>

int main() {
    std::vector<double> v = {0.1, 1.2, 2.6};
    std::vector<double> w;
    std::stringstream ss;
    
    ss.write(const_cast<char*>(reinterpret_cast<const char*>(&v.at(0))), v.size() * sizeof(v.at(0))); // Here it should cast v first into uint an then into char

    for(int i = 0; i < v.size(); ++i) {
        double val; // It should be uint val
        ss.read(reinterpret_cast<char*>(&val), sizeof(val)); 
        w.push_back(val);
    };

    std::cout<<w.at(2)<<std::endl;

    return 0;
}

假设您想像“从 x.5 向上取整”那样“取整”,您可以使用

std::cout<<(unsigned int)(w.at(2)+0.5)<<std::endl;

它使用 0.5 的偏移量来移动截断并根据需要进行四舍五入。

(在您显示的程序中使用这一行的)输出是

3

此代码读取向量,舍入值,然后一次写出一个值。从流中读回时相反。

#include <sstream>
#include <vector>
#include <iostream>
#include <cstdint>
#include <cmath>

int main() {
    std::vector<double> v = {0.1, 1.2, 2.6};
    std::vector<double> w;
    std::stringstream ss;

    for(int i = 0; i < v.size(); ++i) {
        uint64_t val = static_cast<uint64_t>(std::round(v.at(i)));
        ss.write(const_cast<char*>(reinterpret_cast<const char*>(&val)), sizeof(val));
    }

    for(int i = 0; i < v.size(); ++i) {
        uint64_t val;
        ss.read(reinterpret_cast<char*>(&val), sizeof(val));
        w.push_back(static_cast<double>(val));
    };

    std::cout<<w.at(2)<<std::endl;

    return 0;
}

看起来非常简单,不确定您可能还期待什么。

请注意,将 double 转换为 uint64_t 可能会溢出。