Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.79/43: Рейтинг темы: голосов - 43, средняя оценка - 4.79
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296

STL, deque, pair

31.01.2012, 13:30. Показов 10371. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста разобраться.

Есть такая очередь:

C++
1
deque<pair<int, timeval> > last_query
Как работать с такой очередью?
Как пройтись по всем элементам такой очереди?
Как найти минимальный через timeval? // если можно через метод find
Как добавить элемент в очередь, и удалить.
Можно и пройтись по такой очереди с помощью итератора?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.01.2012, 13:30
Ответы с готовыми решениями:

Контейнер deque <pair>
Есть контейнер deque&lt;pair&lt;int, int&gt;&gt; dq; Делаю вставку dq.push_back(make_pair(100, 100)); dq.push_back(make_pair(80, 80)); ...

STL deque
Устройство, основные операции и их стоимость, особенности использования deque. Ни где не могу найти стоимость выполнения основных...

STL, deque Перераспределение памяти
Есть книга, в ней написано такое о деке Можно ли пример увидеть, а-то чего-то непонятно. Пример когда все итераторы из-за...

60
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 02:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Visary_Master Посмотреть сообщение
может ничего не происходит тут:
Да. Я даже не смотрел туда.
Память-то не выделена под элементы очереди. Либо resize, либо push_back. На cplusplus посмотрите примеры.
Да и условие в цикле странное. Почему через запятую?
1
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.02.2012, 02:58  [ТС]
Цитата Сообщение от soon Посмотреть сообщение
Да и условие в цикле странное. Почему через запятую?
потому, что 2 условия

Добавлено через 30 секунд
Цитата Сообщение от soon Посмотреть сообщение
либо push_back
подумал об этом.
Вот, вроде получилось:
C++
1
2
3
4
5
6
7
8
9
10
11
deque<pair<int, timeval> > dq1;
    timeval tv;
    for (int i = 0; i < access_num; ++i)
    {
         for(deque<pair<int, timeval> >::iterator j = dq1.begin(); j != dq1.end(),(k<mem_size); ++j,++k) 
         {
            gettimeofday(&tv, NULL);
            dq1.push_back(pair<int, timeval>(k, tv));
            
         }
    }
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 03:07
Цитата Сообщение от Visary_Master Посмотреть сообщение
потому, что 2 условия
Ага. Сравните
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main()
{
    for(int i = 0, j = 5; i > 5 && --j; ++i)
        std::cout << 1 << ' ';
    std::cout << std::endl;
    for(int i = 0, j = 5; i > 5, (--j); ++i)
        std::cout << 2 << ' ';
    std::cout << std::endl;
    return 0;
}
Только почему там предупреждение не выбило - непонятно.

Цитата Сообщение от Visary_Master Посмотреть сообщение
Вот, вроде получилось:
Ну вот и ладушки
1
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.02.2012, 03:17  [ТС]
Цитата Сообщение от soon Посмотреть сообщение
Ага. Сравните
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main()
{
    for(int i = 0, j = 5; i > 5 && --j; ++i)
        std::cout << 1 << ' ';
    std::cout << std::endl;
    for(int i = 0, j = 5; i > 5, (--j); ++i)
        std::cout << 2 << ' ';
    std::cout << std::endl;
    return 0;
}
Только почему там предупреждение не выбило - непонятно.
Дело в том, что нельзя сделать так:
for(int i = 0, double k = 0.0; ... ...)
разные типы, и компилятор вроде не будет понимать, что две переменные разного типа.

Вывод при том(5-размер очереди...):

0 1328051249 799902
1 1328051249 799904
2 1328051249 799906
3 1328051249 799907
4 1328051249 799909
Добавлено через 3 минуты
Цитата Сообщение от Visary_Master Посмотреть сообщение
i > 5 && --j
точка с запятой там стоит

Добавлено через 2 минуты
осталось сделать поиск, и заменить дольше всех не использующуюся.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 03:19
Цитата Сообщение от Visary_Master Посмотреть сообщение
Дело в том, что нельзя сделать так:
for(int i = 0, double k = 0.0; ... ...)
Дело не в этом
Цитата Сообщение от Visary_Master Посмотреть сообщение
for(deque<pair<int, timeval> >::iterator j = dq1.begin(); j != dq1.end(),(k<mem_size); ++j,++k)
В условии запятая.
0
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.02.2012, 03:20  [ТС]
условия через запятую прописываются.

Подумал... а на while так то не разбить вроде...
Придется превращать в одно условие с &&
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 03:27
Цитата Сообщение от Visary_Master Посмотреть сообщение
условия через запятую прописываются.
Я вам для чего в посте #23 пример привел?
Если лень компилировать и проверять
http://liveworkspace.org/code/... 7de82e6b66
1
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.02.2012, 03:54  [ТС]
дошло...
warning: left operand of comma operator has no effect [-Wunused-value]
компилю g++

Добавлено через 18 минут
Дело думаю в том, что в 1м случае задается условие для обеих переменных, а во втором для отдельных.
пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main()
{
    for(int i = 0, j = 5; i > 5 || --j; ++i)
        std::cout << 1 << ' ';
    std::cout << std::endl;
    for(int i = 0, j = 5; i > 5, (--j); ++i)
        std::cout << 2 << ' ';
    std::cout << std::endl;
    return 0;
}
http://liveworkspace.org/code/... e21cb7f50e
Господи... это еще и разные вещи, у себя не могу исправить.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 04:07
Цитата Сообщение от Visary_Master Посмотреть сообщение
Дело думаю в том, что в 1м случае задается условие для обеих переменных, а во втором для отдельных.
пример:
Оператор запятая последовательно выполняет выражения слева направо, и возвращает результат крайнего правого выражения.
А цикл у вас неправильно построен. Смысл заводить для dq1 итератор, если там нет ни одного элемента? И k пройдет одну итерацию цикла i, и больше не будет увеличиваться.
1
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.02.2012, 12:14  [ТС]
хорошо, я проверю... поможете с поиском?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 12:22
Перегружаете < для timeval и используете std::min_element + нужен функтор. Функтор можете взять из кода на первой странице. Ну и перегрузку оттуда можете взять, только ее подправить нужно будет, я же для своего класса реализовывал.
1
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.02.2012, 15:12  [ТС]
Перегружаю оператор так:
C++
1
2
3
4
bool operator < (const timeval& tv1, const timeval& tv2)
{
    return tv1.tv_sec < tv2.tv_sec;
}
Правильно?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
01.02.2012, 15:20
Цитата Сообщение от Visary_Master Посмотреть сообщение
Правильно?
Да. Как вариант const добавить.
1
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.02.2012, 18:50  [ТС]
Не могу разобраться, перегружая функтор, какие мы параметры должны передавать ему?

Или полностью можно взять кусок кода?

C++
1
2
3
4
5
6
7
8
template <class T>
struct Comp
{
    bool operator () (const T& f, const T& l)
    {
        return f.second < l.second;
    }
};
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
01.02.2012, 18:52
Visary_Master, можете конкретно задание сказать?
Цитата Сообщение от Visary_Master Посмотреть сообщение
Не могу разобраться, перегружая функтор, какие мы параметры должны передавать ему?
Вроде правильно.
0
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.02.2012, 19:06  [ТС]
Нужно реализовать алгоритм LRU с помощью такой двусторонней очереди(ограниченной по размеру 5 ячеек):
deque<pair<int, timeval> >dq
timeval - структура, которая возвращает время с помощью gettimeofday().
Задаем последовательность:
1 2 3 4 5 2 1 2 3 4 3 1 2 3 4 1 2 3
Добавляем в очередь страницы:
1 2 3 4 5
далее страница 2, она есть в памяти
удаляем дольше всех не использовавшуюся страницу, на ее место помещаем страницу 2, а ту страницу с 2, которая дублируется, удаляем... (если я правильно понимаю).
И так далее.
Проблема в том, что я вообще плохо знаю STL. А это хороший вариант как мне кажется(вот бы его реализовать...)
И еще, алгоритм LRU, который зарегламентирован, он должен содержать счетчик, тогда хватило бы обычной очереди думаю. Но с gettimeofday мы смотрим по времени обращения...

Дошел до того, что нужно в такой очереди найти самое маленькое время.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
01.02.2012, 19:44
Цитата Сообщение от Visary_Master Посмотреть сообщение
Дошел до того, что нужно в такой очереди найти самое маленькое время.
C++
1
2
3
4
5
6
7
8
typedef std::pair<T_str, int>    T_pair;
 
 
std::cout << std::min_element(dq.begin(), dq.end(), 
                     [] ( T_pair (a), T_pair (b)) 
                        { return a.second < b.second; })
             -> first; 
          << std::endl;
Так пробовали?
0
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.02.2012, 20:09  [ТС]
Нет, не пробовал, ваш код не компилится.
Сейчас попробую, как говорил, soon.

Добавлено через 5 минут
Получилось сделать(магическим образом), так, как говорил soon...
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
01.02.2012, 20:10
Цитата Сообщение от Visary_Master Посмотреть сообщение
ваш код не компилится.
C++
1
typedef std::pair<T_str, int>    T_pair;
Здесь меняли что-нибудь?
0
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
01.02.2012, 20:11  [ТС]
Теперь нужно сделать удаление этого минимального элемента...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2012, 20:11

Как реализован deque в STL ?
Как реализован deque в STL ? Насколько я понимаю условно все разделяется на блок с адресами и блоки с данными. Есть какие-то...

Реализовать пользовательский класс Pair (упрощённый аналог std::pair)
Здравствуйте. Проблема с выводом. В приложенном задании, требуется сделать вывод как в примере. Мой вывод основан на вводе количества...

Как в vector<pair <класс, int> > добавлять свой объект в качестве первого элемента pair?
#include&lt;iostream&gt; #include &quot;Employee.h&quot; #include&lt;string&gt; #include&lt;algorithm&gt; #include&lt;vector&gt; #include&lt;list&gt; #include &lt;map&gt; ...

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

Как считать данные в vector<pair<int, pair<int, int>>> arr(m) ?
Здравствуйте! Помогите, как считать данные данные в массив такого типа? vector&lt;pair&lt;int, pair&lt;int, int&gt;&gt;&gt; arr(m) Пытался...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru