Войти
ФлеймФорумПрограммирование

Говно STL из говно C++ не даёт оптимально сконвертировать сет в вектор (4 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#45
15:42, 28 авг 2021

If condition is a declaration such as T t = x, the declared variable is only in scope in the body of the loop, and is destroyed and recreated on every iteration, in other words, such while loop is equivalent to

https://en.cppreference.com/w/cpp/language/while

#46
(Правка: 15:57) 15:54, 28 авг 2021

1 frag / 2 deaths
тогда не ясно почему, но ведёт к крэшу.

#47
15:56, 28 авг 2021

Aroch
А минимизировать удаётся? Типа написать какое-то условие в заголовке while с побочным эффектом?
У меня прост нет под рукой крестокомпилятора

#48
16:00, 28 авг 2021

1 frag / 2 deaths
> auto it = foo_set.begin() != foo_set.end()

#!
> а auto it случайно не bool будет?

конечно же bool

auto a = foo_set.begin();
auto b = foo_set.end();
auto it = a != b; // bool
#49
16:00, 28 авг 2021

1 frag / 2 deaths
> Возможно, что он пришёл снаружи и не мне менять его тип.
Так возможно или нет?
Если не можешь избавиться от сета - избавься от вектора. Зачем тебе вектор?

#50
(Правка: 16:03) 16:01, 28 авг 2021

1 frag / 2 deaths
> А минимизировать удаётся? Типа написать какое-то условие в заголовке while с
> побочным эффектом?
> У меня прост нет под рукой крестокомпилятора
#!
был прав. Просто на моём примере это собралось из-за того что сработало не явное приведение bool в int и для Foo(int) it рассматривался в качестве ключа, что для 1 сработало, а потом уже естественным образом сломалось.

В общем в #43 пока что самый компактный и рабочий вариант.

#51
16:16, 28 авг 2021

из разряда совсем уж извращений по типу того что пытался сделать Тарас:

typedef std::optional<std::set<Boo>::iterator> BooOptIterator;

while(BooOptIterator it = (!foo_set.empty() ? BooOptIterator{foo_set.begin()} : std::nullopt)) 
    foo_vector.push_back(std::move(foo_set.extract(*it).value()));
#52
18:42, 28 авг 2021

Sbtrn. Devil
> Не Ц++ говно, а стл - говно. О чём говорено много и неоднократно. Один только
> отказ от имплементации стринга через буфер с рефкаунтом чего стоит - а этого
> бы, в данном случае, хватило бы для невозникновения проблемы.
Так сделано для того, чтобы строки давали адекватное поведение.

А если конкретно тебе нужно нафигачить багов побольше да незаметно сделать программу полагучее вернуть как было раньше, то std::reference и std::shared_ptr есть.

1 frag / 2 deaths
> > Ты копируешь полностью отсортированный std::set
> Мне не нужна копия э
Код что ты написал создаёт копию. Не хочешь копию юзай extract. А хочешь адекватной и быстрой его работы, не юзай медленный std::set.

#53
19:19, 28 авг 2021

Zefick
> Если бы в языке была сборка мусора, то всё было бы шикарно, можно было бы просто
Забыть об этом языке, так как это уже будет медленно как C# и с возможностью сегфолта.

1 frag / 2 deaths
> Сборка мусора не всегда приемлема, да и проблему утечек она тоже не решает.
Решает. Заставить утечь что-то при сборщике не так просто.

gamedevfor
> умный указатель не владелец?
Только уник.

gamedevfor
> Эта штука не будет работать - или не скомпилируется (в лучшем случае) или будет
> проверяться равенство указателей вместо равенства значений. Чтобы это работало
> надо свой компаратор ещё указать.
Скомпилится. Но работать серавно не будет. Мы вернёмся к тойже проблеме, что и вначале.
Надо shared.

Aroch
> проверил, всё прекрасно работает. в Foo оператор сравнения. Причём такая
> обёртка освобождает от необходимости писать move конструктор для Foo.
Не даст он тебе мувнуть ключ сета, так как он константный. Аесли ты снял константность, то нафиг этот уник, можно и со строки снять конст.

#54
(Правка: 19:27) 19:25, 28 авг 2021

samrrr
> Не даст он тебе мувнуть ключ сета, так как он константный. Аесли ты снял
> константность, то нафиг этот уник, можно и со строки снять конст.
#34
samrrr
> Не хочешь копию юзай extract.
спасибо что напомнил, а то с первой страницы про него уже говорим и успели позабыть 🤦‍♂️.

#55
19:53, 28 авг 2021

samrrr
> Скомпилится. Но работать серавно не будет. Мы вернёмся к тойже проблеме, что и
> вначале.
> Надо shared.

Можно сделать свой уник с move послаблениями.

#56
(Правка: 19:59) 19:57, 28 авг 2021

samrrr
> Код что ты написал создаёт копию.
Спасибо, я не знал. При написании 0-поста ещё знал (о чём в нём и написал), но вот к вечеру забыл. Хорошо, что ты напомнил. Что бы мы делали без твоего напоминания.

Да, этот код создаёт копию. Хотя при его написании я был уверен, что избежал копии при помощи мува. И это молча сожралось и скомпилилось в неэффективный код. То, что что-то молча сжирается - это проблема. Не?

samrrr
> Решает. Заставить утечь что-то при сборщике не так просто.
Не решает. Типичная ситуация - огромный ресурс доступен, но не нужен. Причём хрен его знает, по какой ссылке он доступен и почему так вышло.

#57
22:12, 28 авг 2021

1 frag / 2 deaths
> То, что что-то молча сжирается - это проблема. Не?
C++ много чего молча сожрёт. И это далеко не самый ужасный пример. Попробуй хотябы добавить элементы в массив во время итерации.
С++ в основном рассчитан на то, что программисту известно как что работает.

Для меня этот код выглядит так.
Безымянный | Говно STL из говно C++ не даёт оптимально сконвертировать сет в вектор

И вот так:
Безымянный | Говно STL из говно C++ не даёт оптимально сконвертировать сет в вектор

И незаметить варн в муве и константность строки одновременно мне трудно.

1 frag / 2 deaths
> Причём хрен его знает, по какой ссылке он доступен
https://www.jetbrains.com/dotmemory/?source=google&medium=cpc&cam… aAo3kEALw_wcB

#58
22:15, 28 авг 2021

Aroch
> #34

>foo_set.extract(foo).value()

С экстрактом жеж.

#59
22:16, 28 авг 2021

gamedevfor
> Можно сделать свой уник с move послаблениями.
а то, что это нарушает правила константности ничё?

Страницы: 1 2 3 4 5 6 Следующая »
ФлеймФорумПрограммирование