Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.90
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
#1

std::vector доступ по индексу vs доступ по итератору - C++

15.04.2013, 13:30. Просмотров 4294. Ответов 24
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    std::vector<int> tmp;
    int i = 0;
    tmp.resize(1000000);
    std::vector<int>::iterator it = tmp.begin();
    for (int m = 0; m < 10000; ++m)
    {
        for(; it != tmp.end(); ++it)
        {
            (*it) = i + 1;
            ++i;
        }
        it = tmp.begin();
        for(; it != tmp.end(); ++it)
            i = (*it);
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    std::vector<int> tmp;
    int j = 0;
    tmp.resize(1000000);
    for (int m = 0; m < 10000; ++m)
    {
        size_t i = 0;
        for (; i < 1000000; ++i)
        {
            tmp[i] = j + 1;
            ++j;
        }
        i = 0;
        for (; i < 1000000; ++i)
            j = tmp[i];
    }
В дебаге доступ по индексу работает в 2-2.5 раза быстрее, нежели итераторы,
в релизе картина с точностью до наоборот - итераторы в 2 раза быстрее.
Как сие можно объяснить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2013, 13:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос std::vector доступ по индексу vs доступ по итератору (C++):

Ошибка: E2034 Cannot convert 'int' to 'std::vector<std::vector<TRabbitCell,std::allocator<TRabbitCell>>... - C++ Builder
Есть двухмерный вектор: std::vector&lt;std::vector&lt;TRabbitCell&gt; &gt; *cells(5, 10); Пытаюсь заполнить его объектами класса...

Доступ к индексу пиктограммы - C++ Builder
При создании файла или папки непосредственно в программе надо что бы пиктограмма файла отличалась от пиктограммы папки, подскажите...

Зависает программа из-за std::vector - C++ Builder
void __fastcall TAdministratorForm::RouteButtonClick(TObject *Sender) { HideAll(); RoutesPanel-&gt;Show(); ADOTableRoutes-&gt;Open(); ...

Rad Studio XE3 и std::vector - C++ Builder
такая проблема у меня Rad Studio XE3 вообще не хочет переваривать std::vector :( пишу допустим: #include &lt;vector&gt; ... void...

Std:: vector<Structure>, выделение памяти - C++ Builder
Уважаемые, программисты, помогите новичку исправить ошибку, при создании вектора структур. Подскажите, пожалуйста, где я неправильно...

Как сделать массив, доступ к элементам, в котором, возможен и по индексу и по строковому ключу? - Visual C++
В Visual Basic существует объект Collection. Для тех, кто не знает, это аналог массива, в котором могут храниться различные типы данных....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
16.04.2013, 10:15 #16
Тема сисек противостояния раскрыта не полностью. Так что же получается можно забыть про все эти итераторы и работать с индексами и не париться? Зачем два одинаковых механизма?
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
16.04.2013, 10:20  [ТС] #17
Цитата Сообщение от SatanaXIII Посмотреть сообщение
раскрыта не полностью
Что не раскрыто?
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Так что же получается можно забыть про все эти итераторы и работать с индексами и не париться?
Выходит что так...
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Зачем два одинаковых механизма?
У любого индивидуума должен быть выбор, таков принцип демократии.
0
AC-93
16 / 16 / 0
Регистрация: 27.01.2010
Сообщений: 150
16.04.2013, 10:23 #18
Цитата Сообщение от yuron_477 Посмотреть сообщение
не эффективный цикл, на каждой итерации идет обращение к tmp.end().

Добавлено через 2 минуты
Заменить на
C++
1
for(auto stop = tmp.end(); it != stop; ++it)
и попробовать снова.
попробуйте начать менять внутри цикла размер коллекции, и end пересчитываться не будет, поэтому изначальный вариант аналогичен конечному.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
16.04.2013, 10:26 #19
Цитата Сообщение от oxotnik Посмотреть сообщение
У любого индивидуума должен быть выбор, таков принцип демократии.
Лады. Тогда где остальные дублирующие механизмы всего остального?

oxotnik, а как вы вообще замеряли скорость работы?
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
16.04.2013, 10:28  [ТС] #20
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Тогда где остальные дублирующие механизмы всего остального?
Чего конкретно?
К примеру есть указатели, и есть ссылки.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
а как вы вообще замеряли скорость работы?
Каюсь, замерял немного кривовато, с помощюб QTime::elapsed(), но в принципе для теста хватит.
0
Dmitriy_M
1349 / 1230 / 114
Регистрация: 20.03.2009
Сообщений: 4,420
Записей в блоге: 11
16.04.2013, 10:32 #21
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Лады. Тогда где остальные дублирующие механизмы всего остального?
А они нужны?
В составе STL входят куча полезных алгоритмов, которые принимают итераторы. К примеру я могу захотеть отсортировать элементы с 6 по 12 используя std::sort/std::stable_sort.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
16.04.2013, 10:37 #22
Цитата Сообщение от oxotnik Посмотреть сообщение
Чего конкретно?
К примеру есть указатели, и есть ссылки.
Да, вот помимо этих двоих. Хочу два объявления целочисленной переменной.
Это я к тому, что вряд ли итератор с индексами одинаковы. Идентичны да, но вряд ли одинаковы.

Цитата Сообщение от oxotnik Посмотреть сообщение
с помощюб QTime::elapsed(), но в принципе для теста хватит
Померьте еще чем-нибудь. Для статистики пригодится. Чтобы уж точно утверждать.
Или надо алгоритм в разы усложнить.
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
16.04.2013, 11:28  [ТС] #23
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Хочу два объявления целочисленной переменной.
int / unsigned int / size_t + куча дефайнов
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Это я к тому, что вряд ли итератор с индексами одинаковы.
Интересует "интерфейс". Для пользователя (программиста) они одинаковые, т.к. Одинаково выполняют одну и ту же задачу.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Померьте еще чем-нибудь. Для статистики пригодится. Чтобы уж точно утверждать.
Что бы уменьшить ошибку можно количество итераций увеличить... Но тупо лень ждать, да и 3-5% в разнице скорости можно отнести к статистическим ошибкам.
0
Dmitriy_M
1349 / 1230 / 114
Регистрация: 20.03.2009
Сообщений: 4,420
Записей в блоге: 11
16.04.2013, 12:58 #24
Цитата Сообщение от oxotnik Посмотреть сообщение
Интересует "интерфейс". Для пользователя (программиста) они одинаковые, т.к. Одинаково выполняют одну и ту же задачу.
ничего подобного. тут даже отличия приведены.
0
oxotnik
16.04.2013, 13:05  [ТС]     std::vector доступ по индексу vs доступ по итератору
  #25

Не по теме:

Цитата Сообщение от Dmitriy_M Посмотреть сообщение
ничего подобного. тут даже отличия приведены.
я про вышеозначенный контекст говорил

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2013, 13:05
Привет! Вот еще темы с ответами:

std::vector<>::iterator в VS6 и VS2008 - Visual C++
в шестой такое проходит без проблем: std::vector&lt;int&gt; int_vect; int int_buf; int_vect.push_back(0); int_vect.push_back(1); ...

Как в std::vector получить доступ к методам элементов? - C++
Здравствуйте. Нужно что-то вроде этого: #include &lt;iostream&gt; #include &lt;vector&gt; #include &quot;box.h&quot; using namespace std; int...

Доступ по итератору к элементу вектора - C++
Здравствуйте! Подскажите, пожалуйста, решение данной задачи: Дан вектор типа string, в нем есть два элемента. Необходимо добавить в...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами - C++
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.04.2013, 13:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru