Информация об изменениях

Сообщение Re: Про красивость работы с std::vector от 17.03.2025 15:10

Изменено 17.03.2025 15:49 B0FEE664

Re: Про красивость работы с std::vector
Здравствуйте, Shmj, Вы писали:

  Скрытый текст
S>Допустим такая обертка над std::vector:

S>
S>#include <vector>
S>#include <cstdint>
S>#include <cstring>

S>class MyClass
S>{
S>private:
S>    std::vector<uint8_t> data;

S>public:
S>    MyClass() : data(100) {}

S>    void setHeader(uint32_t value)
S>    {
S>        std::memcpy(data.data(), &value, sizeof(value));
S>    }

S>    // ... еще устанавливаем разные части бинарного пакета

S>    const std::vector<uint8_t>& getData() const
S>    {
S>        return data;
S>    }
S>};
S>


S>Не очень красиво что при обращении:

std::vector<uint8_t> t = obj.getData();

S>- будет создавать полную копию всех данных. Как бы постоянная ловушка.
Никакая это не ловушка. Это общепринятая практика.

Т.е. нужно не забывать писать:
std::vector<uint8_t>& t = obj.getData();

const пропущен.

S>И далее. Что если я захочу в итоге переместить данные, забрать владение у MyClass — как красивее оформить?

Написать метод swap

S>
S>std::vector<uint8_t> takeData()
S>{
S>    return std::move(data);
S>}
S>

Так можно, но зачем?

Человек, что боится забыть поставить '&' должен так же боятmся забыть написать obj.takeData(); без присвоения
for(uint8_t n : obj.takeData())
  std::cout << ' ' << n;
std::cout << '\n';

// ой, obj пустой :(
Re: Про красивость работы с std::vector
Здравствуйте, Shmj, Вы писали:

  Скрытый текст
S>Допустим такая обертка над std::vector:

S>
S>#include <vector>
S>#include <cstdint>
S>#include <cstring>

S>class MyClass
S>{
S>private:
S>    std::vector<uint8_t> data;

S>public:
S>    MyClass() : data(100) {}

S>    void setHeader(uint32_t value)
S>    {
S>        std::memcpy(data.data(), &value, sizeof(value));
S>    }

S>    // ... еще устанавливаем разные части бинарного пакета

S>    const std::vector<uint8_t>& getData() const
S>    {
S>        return data;
S>    }
S>};
S>


S>Не очень красиво что при обращении:

std::vector<uint8_t> t = obj.getData();

S>- будет создавать полную копию всех данных. Как бы постоянная ловушка.
Никакая это не ловушка. Это общепринятая практика.

S>Т.е. нужно не забывать писать:

std::vector<uint8_t>& t = obj.getData();

const пропущен.

S>И далее. Что если я захочу в итоге переместить данные, забрать владение у MyClass — как красивее оформить?

Написать метод swap

S>
S>std::vector<uint8_t> takeData()
S>{
S>    return std::move(data);
S>}
S>

Так можно, но зачем?

Человек, что боится забыть поставить '&' должен так же бояться забыть написать obj.takeData(); без присвоения
for(uint8_t n : obj.takeData())
  std::cout << ' ' << n;
std::cout << '\n';

// ой, obj пустой :(