Создайте вектор и напишите его в потоке строк С++

В игрушечной программе, представленной ниже, я пишу и читаю вектор двойников с потоком строк. Однако как я могу записать v как вектор (округленного) uint в ss, чтобы при чтении 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». Правильный?

Yunnosch 15.12.2020 12:53

@Yunnosch Да, это то, что я имею в виду.

Medical physicist 15.12.2020 12:55

Вы можете прокручивать свой вектор, округляя каждое значение по очереди, а затем записывая его в поток строк как uint. Затем вы считываете uints из потока строк, преобразуя каждый в двойной, чтобы добавить к вашему новому вектору. Трудно понять, чего еще вы ожидаете.

john 15.12.2020 13:07

@john Это похоже на ответ, но как мне его реализовать?

Medical physicist 15.12.2020 13:09

поскольку ваши числа имеют только одну цифру после ., вы можете хранить все числа с коэффициентом 10 и использовать целые числа вместо чисел с плавающей запятой

463035818_is_not_a_number 15.12.2020 13:10

@Medicalphysicist Я разместил код ниже.

john 15.12.2020 13:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
241
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предполагая, что вы хотите «округлить», как в «округлении от x.5», вы можете использовать

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

Он использует смещение 0,5 для сдвига усечения и приводит к желаемому округлению.

Вывод (использования этой строки в вашей показанной программе) таков:

3

... как я могу написать (и прочитать) вектор двойников как вектор (округленный) uint...

Medical physicist 15.12.2020 12:56

Пожалуйста, опишите желаемый эффект (для данного образца ввода), который вы хотите увидеть, если вы «запишите (и прочитаете) вектор двойников как вектор (округленного) uint». Кажется, я неправильно понял ваш вопрос. Потому что "чтобы на выходе программы было 3" - это то, что я предлагаю здесь.

Yunnosch 15.12.2020 12:58

Я хочу, чтобы v была записана в ss как вектор uint. Затем, когда w читается из ss, оно должно быть w = {0, 1, 3}

Medical physicist 15.12.2020 13:00

Какое значение ss вы ожидаете после того, как «v записывается в ss как вектор uint»?

Yunnosch 15.12.2020 13:01
Ответ принят как подходящий

Этот код считывает вектор, округляет значения и записывает их по одному. Обратное при обратном чтении из потока.

#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 может привести к переполнению.

Другие вопросы по теме