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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.75
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
#1

STL, deque, pair - C++

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

Здравствуйте, помогите пожалуйста разобраться.

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

C++
1
deque<pair<int, timeval> > last_query
Как работать с такой очередью?
Как пройтись по всем элементам такой очереди?
Как найти минимальный через timeval? // если можно через метод find
Как добавить элемент в очередь, и удалить.
Можно и пройтись по такой очереди с помощью итератора?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2012, 13:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос STL, deque, pair (C++):

Контейнер deque <pair> - C++
Есть контейнер 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 - C++
Устройство, основные операции и их стоимость, особенности использования deque. Ни где не могу найти стоимость выполнения основных...

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.02.2012, 01:41  [ТС] #16
ну я нуб...

Добавлено через 1 час 58 минут
Цитата Сообщение от Mayonez Посмотреть сообщение
C++
1
2
for(deque<pair<int, timeval> >::iterator p = last_query.begin(); p != last_query.end(); p++)
* * *std::cout << p->first << " " << p->second << std::endl;
Ошибки
Код
104:39: error: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char>&)((std::basic_ostream<char>*)std::cout.std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>](p.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator-> [with _Tp = std::pair<int, timeval>, _Ref = std::pair<int, timeval>&, _Ptr = std::pair<int, timeval>*, pointer = std::pair<int, timeval>*]()->std::pair<int, timeval>::first))), ((const char*)" ")) << p.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator-> [with _Tp = std::pair<int, timeval>, _Ref = std::pair<int, timeval>&, _Ptr = std::pair<int, timeval>*, pointer = std::pair<int, timeval>*]()->std::pair<int, timeval>::second’
/usr/include/c++/4.5/ostream:108:7: note: candidates are: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 02:07 #17
Ой, давайте лучше весь код. Похоже у вас не перегружен <<.
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.02.2012, 02:15  [ТС] #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <deque>
#include <algorithm>
#include <utility>
#include <cstdlib>
using namespace std;
 
int main()
{
    int n = 10;
    int *array = new int[n];
    int mem_size = 5;
    int access_num; // переменная для доступа к памяти
    
    cout << "Введите кол-во обращений к страницам памяти: " << endl;
    cin >> access_num;
    
    cout << "Введите последовательность обращения к страницам: " << endl;
    for(int it = 0; it < access_num; it++)
        cin >> array[it]; 
 
    // LRU - дольше всех не использовавшаяся
    int k = 0;
    deque<pair<int, timeval> > dq1;
    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) 
         {
            j->first = k;
            gettimeofday(&(j->second), NULL);
         }
    }
    /*
    for(deque<pair<int, timeval> >::iterator p = dq1.begin(); p != dq1.end(); p++)
        cout << p->first << " " << p->second << endl;
 
   /*
    for (deque<pair<int, timeval> >::iterator it = dq1.begin(); it != dq1.end(); ++it)
        cout << it->first << ' ' << it->second << endl;
    */
    cout << endl;
    
    return 0;   
}
Прошу прощения, я не знаю как перегружать...

пробовал вставлять в код:
C++
1
2
3
4
5
ostream& operator << (std::ostream& s, const TimeVal& t)
{
          s << t.a;
          return s;
}
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 02:27 #19
C++
1
2
3
4
5
ostream& operator << (ostream& s, const timeval& tv)
{
    s << tv.tv_sec << ' ' << tv.tv_usec;
    return s;
}
Перед int main()
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.02.2012, 02:44  [ТС] #20
Не выводит ошибок, но ничего и не выводит... вывожу так:
C++
1
2
for (deque<pair<int, timeval> >::iterator it = dq1.begin(); it != dq1.end(); ++it)
        cout << it->first << ' ' << it->second << endl;
может ничего не происходит тут:
C++
1
2
j->first = k;
gettimeofday(&(j->second), NULL);
?
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 02:54 #21
Цитата Сообщение от Visary_Master Посмотреть сообщение
может ничего не происходит тут:
Да. Я даже не смотрел туда.
Память-то не выделена под элементы очереди. Либо resize, либо push_back. На cplusplus посмотрите примеры.
Да и условие в цикле странное. Почему через запятую?
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.02.2012, 02:58  [ТС] #22
Цитата Сообщение от 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));
            
         }
    }
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 03:07 #23
Цитата Сообщение от 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 Посмотреть сообщение
Вот, вроде получилось:
Ну вот и ладушки
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.02.2012, 03:17  [ТС] #24
Цитата Сообщение от 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 минуты
осталось сделать поиск, и заменить дольше всех не использующуюся.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 03:19 #25
Цитата Сообщение от 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)
В условии запятая.
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.02.2012, 03:20  [ТС] #26
условия через запятую прописываются.

Подумал... а на while так то не разбить вроде...
Придется превращать в одно условие с &&
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 03:27 #27
Цитата Сообщение от Visary_Master Посмотреть сообщение
условия через запятую прописываются.
Я вам для чего в посте #23 пример привел?
Если лень компилировать и проверять
http://liveworkspace.org/code/38bdad...239b7de82e6b66
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.02.2012, 03:54  [ТС] #28
дошло...
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/47de36...d3cbe21cb7f50e
Господи... это еще и разные вещи, у себя не могу исправить.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 04:07 #29
Цитата Сообщение от Visary_Master Посмотреть сообщение
Дело думаю в том, что в 1м случае задается условие для обеих переменных, а во втором для отдельных.
пример:
Оператор запятая последовательно выполняет выражения слева направо, и возвращает результат крайнего правого выражения.
А цикл у вас неправильно построен. Смысл заводить для dq1 итератор, если там нет ни одного элемента? И k пройдет одну итерацию цикла i, и больше не будет увеличиваться.
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.02.2012, 12:14  [ТС] #30
хорошо, я проверю... поможете с поиском?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2012, 12:14
Привет! Вот еще темы с ответами:

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

Compair deque - C++
есть два списка. Теперь мне нужно сравнить элементы если х &lt;у то return (x+y) . я так думаю надо результат в 3 список записать как мне...

std::deque - C++
Как известно при добавлении в конец вектора элементов(и не только в конец) может возникнуть перераспределение памяти что переместит данные...

Контейнер deque - C++
Задание:(используя контейнер deque) ввести последовательность натуральных чисел,у конце которой 0.Не сохраняя всей последовательности в...


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

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

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