Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/27: Рейтинг темы: голосов - 27, средняя оценка - 5.00
Visary_Master
16 / 17 / 1
Регистрация: 01.12.2010
Сообщений: 296
1

STL, deque, pair

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

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

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

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

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

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

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

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

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

60
Mayonez
382 / 274 / 53
Регистрация: 26.12.2009
Сообщений: 875
31.01.2012, 14:33 2
Цитата Сообщение от Visary_Master Посмотреть сообщение
Как пройтись по всем элементам такой очереди?
C++
1
2
for(auto p = begin(last_query); p != end(last_query); p++)
    std::cout << p->first << " " << p->second << std::endl;
Добавлено через 33 секунды
Цитата Сообщение от Visary_Master Посмотреть сообщение
Как найти минимальный через timeval? // если можно через метод find
что у нас timeval?

Добавлено через 3 минуты
Цитата Сообщение от Visary_Master Посмотреть сообщение
Как добавить элемент в очередь, и удалить
C++
1
push_back(), push_front(), insert(begin , end),
C++
1
pop_back(), pop_front(), erase(iter i)
Добавлено через 51 секунду
Цитата Сообщение от Visary_Master Посмотреть сообщение
Можно и пройтись по такой очереди с помощью итератора?
up up up

Добавлено через 23 секунды
Цитата Сообщение от Visary_Master Посмотреть сообщение
Как работать с такой очередью?
все выше
1
Visary_Master
16 / 17 / 1
Регистрация: 01.12.2010
Сообщений: 296
31.01.2012, 15:09  [ТС] 3
C++
1
2
timeval tv;
gettimeofday(&tv, NULL);
Так буду использовать примерно.
библиотеку не помню, сейчас на винде
0
Mayonez
382 / 274 / 53
Регистрация: 26.12.2009
Сообщений: 875
31.01.2012, 15:38 4
Visary_Master, find_if(), но лучше сразу min с предикатом
1
Visary_Master
16 / 17 / 1
Регистрация: 01.12.2010
Сообщений: 296
31.01.2012, 20:07  [ТС] 5
Цитата Сообщение от Mayonez Посмотреть сообщение
C++
1
2
for(auto p = begin(last_query); p != end(last_query); p++)
     std::cout << p->first << " " << p->second << std::endl;
без авто можешь расписать?
Просто я новый стандарт не смотрел серьезно.

знаю, что с предикатом в queue не получилось бы. А deque получиться? Как конкретно использовать этот предикат, просто проблема, какие параметры в этот метод передавать.
0
Mayonez
382 / 274 / 53
Регистрация: 26.12.2009
Сообщений: 875
31.01.2012, 20:24 6
Цитата Сообщение от Visary_Master Посмотреть сообщение
без авто можешь расписать?
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;
1
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 20:45 7
Visary_Master, Вот нахождение минимального элемента. Как видите, нужен оператор сравнения.
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <deque>
#include <utility>
#include <algorithm>
#include <ctime>
#include <cstdlib>
 
class TimeVal
{
    int a;
    
public:
    TimeVal(): a(std::rand() % 21)
    {
        
    }
    
    TimeVal(const int& _a): a(_a)
    {
        
    }
    
    bool operator < (const TimeVal& tv) const
    {
        return a < tv.a;
    }
    
    friend std::ostream& operator << (std::ostream& s, const TimeVal& t)
    {
        s << t.a;
        return s;
    }
};
 
template <class T>
struct Comp
{
    bool operator () (const T& f, const T& l)
    {
        return f.second < l.second;
    }
};
 
int main()
{
    std::srand(std::time(0));
    std::deque<std::pair<int, TimeVal> > dq;
    dq.push_back(std::pair<int, TimeVal>(1, TimeVal()));
    dq.push_back(std::pair<int, TimeVal>(2, TimeVal()));
    dq.push_back(std::pair<int, TimeVal>(3, TimeVal()));
    for
    (
        std::deque<std::pair<int, TimeVal> >::iterator it = dq.begin();
        it != dq.end();
        ++it
    )
        std::cout << it -> first << ' ' << it -> second << std::endl;
    
    std::deque
    <
        std::pair
        <
            int,
            TimeVal
        >
    >::iterator min =   std::min_element
                        (
                            dq.begin(),
                            dq.end(),
                            Comp
                            <
                                std::pair
                                <
                                    int,
                                    TimeVal
                                >
                            >()
                        );
    std::cout << min -> first << ' ' << min -> second << std::endl;
    return 0;
}
Без C++11.
2
Visary_Master
16 / 17 / 1
Регистрация: 01.12.2010
Сообщений: 296
31.01.2012, 21:12  [ТС] 8
Цитата Сообщение от soon Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class TimeVal
{
    int a;
public:
TimeVal(): a(std::rand() % 21)
{}
TimeVal(const int& _a): a(_a)
{}
bool operator < (const TimeVal& tv) const
{
         return a < tv.a;
}
friend std::ostream& operator << (std::ostream& s, const TimeVal& t)
{
          s << t.a;
          return s;
}
};
Хочу вот этой функцией воспользоваться:
http://linux.die.net/man/2/gettimeofday
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 21:17 9
Visary_Master, Тогда перегружаете оператор сравнения с двумя параметрами.
Или в Comp перегружаете скобки, в которых вручную сравниваете 2 объекта. В этом случае можно не перегружать <
1
Visary_Master
16 / 17 / 1
Регистрация: 01.12.2010
Сообщений: 296
31.01.2012, 21:24  [ТС] 10
я просто параллельно завел тему:
Алгоритмы замещения страниц памяти(LRU, STL, gettimeofday)
мне предложили очередь из пар.
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 21:36 11
Visary_Master, а вопрос-то какой? Найти самый ранний элемент? Если да, то выше я показал как делать. Можно еще через лямбду, если допустимо использование C++11. Если нет, то какая проблема, я просто сути поста не уловил.
1
Visary_Master
16 / 17 / 1
Регистрация: 01.12.2010
Сообщений: 296
31.01.2012, 22:46  [ТС] 12
Цитата Сообщение от soon Посмотреть сообщение
Visary_Master, а вопрос-то какой? Найти самый ранний элемент? Если да, то выше я показал как делать. Можно еще через лямбду, если допустимо использование C++11. Если нет, то какая проблема, я просто сути поста не уловил.
Надо найти самое маленькое время(timeval), поменять ей время последнего обращения.
Сейчас попробую, может получится.

Добавлено через 21 минуту
C++
1
using namespace std;
Добавлено через 4 минуты
попробовал сделать так:

C++
1
2
deque<pair<int, timeval> > dq;
for(deque<pair<int, timeval> >::iterator j = dq.begin(); j != dq.end(); ++j)
не компилится

как же в STL просто все...
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 22:50 13
Цитата Сообщение от Visary_Master Посмотреть сообщение
не компилится
Ошибки какие?

Цитата Сообщение от Visary_Master Посмотреть сообщение
Надо найти самое маленькое время(timeval), поменять ей время последнего обращения.
Пишете функтор для класса timeval и находите минимальное значение через min_element.
1
Visary_Master
16 / 17 / 1
Регистрация: 01.12.2010
Сообщений: 296
31.01.2012, 22:53  [ТС] 14
Цитата Сообщение от soon Посмотреть сообщение
Ошибки какие?
lab7_1.cpp:84:32: error: conflicting declaration ‘std::deque<std:air<int, timeval> > dq’
lab7_1.cpp:35:16: error: ‘dq’ has a previous declaration as ‘std::deque<int> dq’
lab7_1.cpp:87:64: error: conversion from ‘std::deque<int>::iterator’ to non-scalar type ‘std::deque<std:air<int, timeval> >::iterator’ requested
lab7_1.cpp:87:79: error: no match for ‘operator!=’ in ‘j != std::deque<_Tp, _Alloc>::end() [with _Tp = int, _Alloc = std::allocator<int>, std::deque<_Tp, _Alloc>::iterator = std::_Deque_iterator<int, int&, int*>]()’
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 23:05 15
Цитата Сообщение от Visary_Master Посмотреть сообщение
error: ‘dq’ has a previous declaration as ‘std::deque<int> dq
Раньше его объявили.
1
Visary_Master
16 / 17 / 1
Регистрация: 01.12.2010
Сообщений: 296
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>]
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 02:07 17
Ой, давайте лучше весь код. Похоже у вас не перегружен <<.
1
Visary_Master
16 / 17 / 1
Регистрация: 01.12.2010
Сообщений: 296
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;
}
0
soon
2546 / 1311 / 177
Регистрация: 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()
1
Visary_Master
16 / 17 / 1
Регистрация: 01.12.2010
Сообщений: 296
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);
?
0
01.02.2012, 02:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2012, 02:44

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

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

deque<float>
Создать контейнер deque и заполнить его типом данных &lt;float&gt;, вывести на экран....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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