Size: a a a

2020 August 17

AK

Andrew Kozlov in pro.cxx
если только 1М взять за константу, то итерация по вектору константной длины и есть константа, да
источник

AS

Alex Sandrov in pro.cxx
Pavel
Чтобы получить и константный доступ по ключу и преимущества локальности при итерировании - это нужно положить хэш таблицу в вектор :) Из очевидных недостатков - вставка/удаление элементов будут дорогими, так что лучше будет сформировать коллекцию как заранее и потом её не модифицировать. Возможно, готовые реализации уже есть, ну или можно свою написать, там не так сложно.
ну вот у меня такая же идея. Пока я делал так: держал и мапу и вектор, элементы - shared_ptr, поэтому можно не сильно дорого держать и там и там. Так себе решение, но быстро и сравнительно удобно
источник

AS

Alex Sandrov in pro.cxx
Andrew Kozlov
если только 1М взять за константу, то итерация по вектору константной длины и есть константа, да
имелось ввиду просто взять v[1M], это равносильно v.begin() + 1M, тогда как чтобы взять m[1M] придётся бежать от начала до 1М-элемента
источник

AK

Andrew Kozlov in pro.cxx
Alex Sandrov
имелось ввиду просто взять v[1M], это равносильно v.begin() + 1M, тогда как чтобы взять m[1M] придётся бежать от начала до 1М-элемента
Имелось в виду, что здесь половина людей разговаривают в терминах асимптотической скорости. Одинаково быстро итерироваться по вектору и по мапе — это значит и там, и там, рост времени одинаковый (линейный) с ростом кол-ва элементов, а не то, что итерация по контейнеру займёт одинаковое число машинных тактов.
источник

AS

Alex Sandrov in pro.cxx
Andrew Kozlov
Имелось в виду, что здесь половина людей разговаривают в терминах асимптотической скорости. Одинаково быстро итерироваться по вектору и по мапе — это значит и там, и там, рост времени одинаковый (линейный) с ростом кол-ва элементов, а не то, что итерация по контейнеру займёт одинаковое число машинных тактов.
Это понятно, хорошо. Мне важен быстрый доступ по порядковому индексу.
источник

AK

Andrew Kozlov in pro.cxx
ну тогда вектор+мапа, как уже и есть, насколько я понял. норм решение, ничего не "так себе"
источник

AS

Anatoly Shirokov in pro.cxx
Alex Sandrov
Это понятно, хорошо. Мне важен быстрый доступ по порядковому индексу.
Это вектор или дека. Random access O(1). Ну, еще unordered_map с этой же сложностью, но на практике все очень сильно будет зависеть от хеш функции и числа коллизий на реальных данных.
источник

A

Alex in pro.cxx
Воюю с unique_ptr и incomplete type. Система такая:
a.hpp:
struct A{};

b.hpp:
#include <memory>
struct A;
struct B {
  ~B();

  std::unique_ptr<A> a;
};

b.cpp:
#include "a.hpp"
B::~B() {}

main.cpp:
#include "b.hpp"
int main(){
  B b;
  return 0;
}

Получаю ошибку удаления incomplete type A в main.cpp. КАК??? Почему?
источник

SE

Stanislav Ershov in pro.cxx
Alex
Воюю с unique_ptr и incomplete type. Система такая:
a.hpp:
struct A{};

b.hpp:
#include <memory>
struct A;
struct B {
  ~B();

  std::unique_ptr<A> a;
};

b.cpp:
#include "a.hpp"
B::~B() {}

main.cpp:
#include "b.hpp"
int main(){
  B b;
  return 0;
}

Получаю ошибку удаления incomplete type A в main.cpp. КАК??? Почему?
а что мешает сделать ~B() = default; ?
источник

AK

Andrew Kozlov in pro.cxx
определение A недоступно из main.cpp
источник

AK

Andrew Kozlov in pro.cxx
только объявление
источник

AK

Andrew Kozlov in pro.cxx
#include "a.hpp" надо
источник

A

Alex in pro.cxx
Andrew Kozlov
только объявление
Да, в этом и смысл forward declaration. А зачем в main.cpp определение деструктора А, если юник пойнтер разрушается деструктором В, а деструктор В в другом .срр файле и другом TU????
источник

AK

Andrew Kozlov in pro.cxx
там тоже нет определения
источник

AK

Andrew Kozlov in pro.cxx
его нигде нет, насколько я вижу
источник

A

Alex in pro.cxx
там есть, я забыл вписать инклуд
источник

A

Alex in pro.cxx
исправил
источник

A

Alex in pro.cxx
смысл в том, чтобы инклуды не расползались по всем .срр файлам, я принципиально не хочу включать А в main.cpp, и не понимаю, почему это нужно
источник

S

Salt in pro.cxx
Он не видит default_deleter или как то так для struct A.
источник

A

Alex in pro.cxx
Это я понимаю, не понимаю, какого чёрта обращение к нему генерится в main, а не в b.cpp, где всё нужное есть
источник