вставка QVector в другой QVector |
Здравствуйте, гость ( Вход | Регистрация )
вставка QVector в другой QVector |
Авварон |
15.2.2013, 18:44
Сообщение
#41
|
Студент Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: 0 |
То есть тест вы так и не скачали и не посмотрели?
Да, какие еще ограничения добавите? upd: прогнал и этот тест. Чуть лучше для std - std::vector и QVector равны по всем параметрам; QList чуть медленнее аппендит, гораздо быстрее препендит и рандомная вставка у Кулиста чуть лучше. Не вижу, почему вы считаете использование QString'а в тесте "несостоятельным" - контейнеры, содержащие строки достаточно распространены, не использовать же на каждый чих контейнеры с указателями на строки? Сообщение отредактировал Авварон - 15.2.2013, 19:05 |
|
|
Алексей1153 |
15.2.2013, 19:07
Сообщение
#42
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
почему вы считаете использование QString'а в тесте "несостоятельным" где я такое писал ? а разница в том, что указатель - простой тип - будет копироваться в векторе тем самым memmove (сразу вся перемещаемая часть указателей то есть). А QString - оператором =. И фиг с ним, с QString , я его всегда с удовольствием применяю даже в stl-контейнерах. Самое неприятное, когда элемент содержит указатели на динамические объекты - и возня с копированием ичень достаёт. Проще просто указатели в векторе/мапе и хранить |
|
|
Авварон |
15.2.2013, 19:41
Сообщение
#43
|
Студент Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: 0 |
В том-то и вся фишка, что для QString не используется operator=, отсюда и разница в производительности в 10раз. Из-за шаред даты внутри QString QList/QVector используют memmove для ЛЮБЫХ типов Qt, основанных на COW (так как они являются перемещаемыми). Более того, вы можете применять эту оптимизацию это для своих типов при помощи макроса Q_DECLARE_TYPEINFO.
|
|
|
Алексей1153 |
15.2.2013, 20:33
Сообщение
#44
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
Авварон |
16.2.2013, 0:03
Сообщение
#45
|
Студент Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: 0 |
Всё дело в том, что у QString'а в хедере есть следующий код:
благодаря которому QVector/QList "узнают" о том, что QString можно является movable и его можно перемещать меммувом. На всякий случай приведу код, его должно быть достаточно для понимания, как оно работает: Раскрывающийся текст
Вы легко можете проверить сами, является ли тип статичным (то есть то, что он НЕ примитивен и НЕ мувабл):
|
|
|
__ilya__ |
16.2.2013, 12:37
Сообщение
#46
|
Студент Группа: Участник Сообщений: 57 Регистрация: 19.1.2012 Пользователь №: 3143 Спасибо сказали: 0 раз(а) Репутация: 0 |
в общем два вектора соеденяются так:
Правильно? |
|
|
Алексей1153 |
16.2.2013, 16:33
Сообщение
#47
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Авварон, ну QString, по сути, и есть один указатель, так что различия с вектором нет, если там применять указатели так же. В MFC раньше похоже был устроен CString , но потом его зашаблонили ))
__ilya__, так попробуй и всё, это же быстрее ) |
|
|
Авварон |
17.2.2013, 10:32
Сообщение
#48
|
Студент Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: 0 |
|
|
|
Алексей1153 |
17.2.2013, 12:30
Сообщение
#49
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
Авварон |
17.2.2013, 13:30
Сообщение
#50
|
Студент Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: 0 |
|
|
|
Текстовая версия | Сейчас: 29.11.2024, 13:46 |