Russian Qt Forum
Апрель 28, 2024, 02:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5 6   Вниз
  Печать  
Автор Тема: Современные одномерные и двумерные массивы на C++  (Прочитано 46439 раз)
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #30 : Октябрь 30, 2014, 12:22 »

Хорошо, вы знаете и понимаете, тогда приведите несколько убедительных примеров. Где лучше применять вектор, а где статический и динамический массивы. Я пока своими глазами не увижу, не поверю

Цитировать
Например, даже современному OpenGL все эти std::vector совершенно до лампочки, он спокойно кушает старые дедовские статические и динамические массивы
Ну и что. Мы спокойно можем работать с std::vector, а функциям OpenGL передавать указатель на буфер vec.data()

Пример с OpenGL вполне самодостаточен, как и с другими Сишными библиотеками. Да и WinApi тоже. В общем случае функции, которые получают на вход указатель на массив заданного размера и типа данных.

Кусок кода для OpenGL:
Код
C++ (Qt)
// The fullscreen quad's FBO
GLuint quad_VertexArrayID;
glGenVertexArrays(1, &quad_VertexArrayID);
glBindVertexArray(quad_VertexArrayID);
 
static const GLfloat g_quad_vertex_buffer_data[] = {
   -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
   -1.0f,  1.0f, 0.0f,
   -1.0f,  1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    1.0f,  1.0f, 0.0f,
};
 
GLuint quad_vertexbuffer;
glGenBuffers(1, &quad_vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW);
 

Сделайте аналог g_quad_vertex_buffer_data на std::vector, заполните его данными, и сравните быстродействие этих операций со старым и ненужным массивом Улыбающийся.
Записан

Пока сам не сделаешь...
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #31 : Октябрь 30, 2014, 12:24 »

То что вектор умеет увеличиваться в размерах автоматом, это может и плюс, когда нужно 100 элементов добавить. А если вертексов пару миллионов? Ты попробуй сперва код такой напиши, и посмотрим сколько времени уйдет тупо на ресайз вектора.
Ну и сколько времени уйдет на ресайз вектора? Приведи более быстрый вариант.

Вектор не фрагментриуется, как лист например, поэтому при ресайзе будет происходить копирование.
Кэп это ты?

Цитировать
И врядли мы напишем более эффективную версию, чем vec.push_back()

Пожалуйста, нижеприведенный аналог работает быстрее!
Код:
data[pos] = dt;
Аналог !?

А что делать если нужно пользовать msvsc?
Страдать молча.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #32 : Октябрь 30, 2014, 12:37 »

Сделайте аналог g_quad_vertex_buffer_data на std::vector, заполните его данными, и сравните быстродействие этих операций со старым и ненужным массивом Улыбающийся.
Вот я накидал аналог, если не трудно потестируйте. (правда я не компелировал, но должно работать)
Код
C++ (Qt)
// The fullscreen quad's FBO
GLuint quad_VertexArrayID;
glGenVertexArrays(1, &quad_VertexArrayID);
glBindVertexArray(quad_VertexArrayID);
 
typedef std::vector<float> test_container ;
//typedef std::array<float,18> test_container ;
 
static const test_container g_quad_vertex_buffer_data = {
   -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
   -1.0f,  1.0f, 0.0f,
   -1.0f,  1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    1.0f,  1.0f, 0.0f,
};
 
GLuint quad_vertexbuffer;
glGenBuffers(1, &quad_vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, g_quad_vertex_buffer_data.size(), g_quad_vertex_buffer_data.data(), GL_STATIC_DRAW);
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #33 : Октябрь 30, 2014, 12:42 »

Вот я накидал аналог, если не трудно потестируйте. (правда я не компелировал, но должно работать)

А Вы таки скомпелируйте и потестируйте Улыбающийся. Код OpenGL можно убрать, оставить только создание и заполнение массива/вектора.
Записан

Пока сам не сделаешь...
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #34 : Октябрь 30, 2014, 12:49 »

А Вы таки скомпелируйте и потестируйте Улыбающийся. Код OpenGL можно убрать, оставить только создание и заполнение массива/вектора.
Нет уж. Это ж ты заявляешь что код с вектором капец как неоптималет, доказывай.
« Последнее редактирование: Октябрь 30, 2014, 12:51 от alex312 » Записан
vulko
Гость
« Ответ #35 : Октябрь 30, 2014, 12:57 »

То что вектор умеет увеличиваться в размерах автоматом, это может и плюс, когда нужно 100 элементов добавить. А если вертексов пару миллионов? Ты попробуй сперва код такой напиши, и посмотрим сколько времени уйдет тупо на ресайз вектора.
Ну и сколько времени уйдет на ресайз вектора? Приведи более быстрый вариант.
Верхняя граница - O(n)
Зачем мне приводить более быстрый вариант? Я вообще тут за вектор не агитирую если что!

Если совсем упирается в постоянные ресайзы, лучшей перейти на другой контейнер. Есть реализации вектора с фрагментированием. При этом правда собрать буфер типа vector.data() займет поболее времени... но тут из 2-х зол выбирают меньшее.


Цитировать
И врядли мы напишем более эффективную версию, чем vec.push_back()
Пожалуйста, нижеприведенный аналог работает быстрее!
Код:
data[pos] = dt;
Аналог !?

А чем не аналог? Вообще в большинстве случаев размер вектора можно вычислить заранее. А если нельзя... часто берут другие контейнеры.

Ну и опять же вернемся к контексту дискуссии.

Автор привел пример, где он добавил пару-тройку вертексов в контейнер (vector.push_back(val)).
Поскольку push_back увеличивает размер вектора, то получается заранее сделать resize и не терять время на ненужные копирования и ресайзы уже не получится.

А если есть пара миллионов вертексов? Итог думаю вполне понятен.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #36 : Октябрь 30, 2014, 12:59 »

Как-то все начали наезжать на ресайзы вектора... А как вы стандартные массивы ресайзить собрались? О_о
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #37 : Октябрь 30, 2014, 13:08 »

Вот я накидал аналог, если не трудно потестируйте. (правда я не компелировал, но должно работать)
Дело здесь не в скорости. Зачем мы создавали вектор если, в данном случае, не собирались использовать никаких его выгод? Объявляя массив мы четко заявляем - пополнять не будем, или будем пере-создавать явно. Это важно для понимания текста др программистом. Делая вектор "на всякий случай" мы эту ясность теряем. Да и вообще, посмотрим как делают люди
Код
C++ (Qt)
 
// QHash.cpp
     if (numBuckets) {
       QT_TRY {
           d->buckets = new Node *[numBuckets];
       } QT_CATCH(...) {
 
Оба-на! А чего же не QVector? Ведь он, якобы, "всегда лучше"  Улыбающийся

Страдать молча.
С какой это стати? Проблемы совместимости и конкретной реализации никто не отменял. Вообще кто знает, а вдруг std - тупиковая ветвь эволюции?  Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #38 : Октябрь 30, 2014, 13:10 »

Да, есть еще std::array.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #39 : Октябрь 30, 2014, 13:12 »

Вот я накидал аналог, если не трудно потестируйте. (правда я не компелировал, но должно работать)
...
Нет уж. Это ж ты заявляешь что код с вектором капец как неоптималет, доказывай.

А Вы не накидывайте Улыбающийся. Особенно то, что невооружённым взглядом видно, что не скомпилируется.

Изначально я обращался к автору темы. Если Вы предлагаете вариант реализации, то объясните, по каким критериям оно лучше приведённого в моём примере. А тестировать будут те, кому это действительно интересно.
Записан

Пока сам не сделаешь...
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #40 : Октябрь 30, 2014, 13:12 »

И вообще, лучше всегда предпочитать более высокий уровень (вектор), ибо работа с ним менее подвержена ошибкам и более понятна. А вот если нужно оптимизировать по скорости, тогда милости просим, делайте все на указателях, но изолируйте этот код и добавьте описание.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #41 : Октябрь 30, 2014, 13:18 »


Верхняя граница - O(n)
Отлично, и сколько будет О(n) при n=0 ?

Зачем мне приводить более быстрый вариант? Я вообще тут за вектор не агитирую если что!
Ну, если ты что-то утверждаешь, то это надо агрументировать. А просто так языком махать может каждый.

А чем не аналог? Вообще в большинстве случаев размер вектора можно вычислить заранее.
Ну если для тебя добавление элемента в конец массива и присваивание элемента массива по индексу это аналогичные операции, то о чем мы тогда разговариваем ?

Автор привел пример, где он добавил пару-тройку вертексов в контейнер (vector.push_back(val)).
Поскольку push_back увеличивает размер вектора, то получается заранее сделать resize и не терять время на ненужные копирования и ресайзы уже не получится.
А если есть пара миллионов вертексов? Итог думаю вполне понятен.
Тебе, перед тем как спорить с взрослыми дядями про С++, пора узнать что у вектора есть метод std::vector::reserve( size_type new_cap ).
Записан
vulko
Гость
« Ответ #42 : Октябрь 30, 2014, 13:19 »

Как-то все начали наезжать на ресайзы вектора... А как вы стандартные массивы ресайзить собрались? О_о

Так почитай топик, автор со всей гордостью заявляет что врядли получится сделать более быструю реализацию push_back.
Также он кричит как охренительно юзать вектор, потому что пофик на размер, будем тупо push_back.
Забывая про вполне вероятный реалокейт.


И вообще, лучше всегда предпочитать более высокий уровень (вектор), ибо работа с ним менее подвержена ошибкам и более понятна. А вот если нужно оптимизировать по скорости, тогда милости просим, делайте все на указателях, но изолируйте этот код и добавьте описание.

А вот это неверно.
Да, уровень выше, но ошибки тут связаны с другим, а именно со сложностью операций.
А вот познания многих людей не достаточно широки, чтобы сразу понять можно тут вектор, или не нужно.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #43 : Октябрь 30, 2014, 13:23 »


И вообще, лучше всегда предпочитать более высокий уровень (вектор), ибо работа с ним менее подвержена ошибкам и более понятна. А вот если нужно оптимизировать по скорости, тогда милости просим, делайте все на указателях, но изолируйте этот код и добавьте описание.

А вот это неверно.
Да, уровень выше, но ошибки тут связаны с другим, а именно со сложностью операций.
А вот познания многих людей не достаточно широки, чтобы сразу понять можно тут вектор, или не нужно.
Какая сложность операций? На паре тысяч элементов ты не заметишь разницу по скорости между пушбэком на пустой вектор и первоначальным ресайзом. Если скорость становится более критичной, делаем ресайз изначально. Если этого не хватает, переходим на самописные реализации.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vulko
Гость
« Ответ #44 : Октябрь 30, 2014, 13:26 »

Отлично, и сколько будет О(n) при n=0 ?
О(n) не будет нисколько.
О(n) это значит что по верхней границе, линейная сложность.

Ну если для тебя добавление элемента в конец массива и присваивание элемента массива по индексу это аналогичные операции, то о чем мы тогда разговариваем ?
Начнем наш урок с начала. Вектор это не массив. Это контейнер.
Теперь ко второй претензии...
Аналогичные? Да.
Идентичные? Нет.

Ну, если ты что-то утверждаешь, то это надо агрументировать. А просто так языком махать может каждый.

Тебе, перед тем как спорить с взрослыми дядями про С++, пора узнать что у вектора есть метод std::vector::reserve( size_type new_cap ).
Взрослый дядя, ты свой аргумент уже откомпилировал?)))
Ты может и чутка постарше, но дядя это ты явно преувеличил свои возможности!)))
Записан
Страниц: 1 2 [3] 4 5 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.115 секунд. Запросов: 22.