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

STL, deque, pair - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.75
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.01.2012, 13:30     STL, deque, pair #1
Здравствуйте, помогите пожалуйста разобраться.

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

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
Посмотрите здесь:

STL std::set, std::pair, std::make_pair C++
C++ deque<float>
C++ std::deque
C++ deque iterator not dereferencable
Контейнер deque C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
31.01.2012, 14:33     STL, deque, pair #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 Посмотреть сообщение
Как работать с такой очередью?
все выше
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.01.2012, 15:09  [ТС]     STL, deque, pair #3
C++
1
2
timeval tv;
gettimeofday(&tv, NULL);
Так буду использовать примерно.
библиотеку не помню, сейчас на винде
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
31.01.2012, 15:38     STL, deque, pair #4
Visary_Master, find_if(), но лучше сразу min с предикатом
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.01.2012, 20:07  [ТС]     STL, deque, pair #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 получиться? Как конкретно использовать этот предикат, просто проблема, какие параметры в этот метод передавать.
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
31.01.2012, 20:24     STL, deque, pair #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;
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 20:45     STL, deque, pair #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.
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.01.2012, 21:12  [ТС]     STL, deque, pair #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
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 21:17     STL, deque, pair #9
Visary_Master, Тогда перегружаете оператор сравнения с двумя параметрами.
Или в Comp перегружаете скобки, в которых вручную сравниваете 2 объекта. В этом случае можно не перегружать <
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.01.2012, 21:24  [ТС]     STL, deque, pair #10
я просто параллельно завел тему:
Алгоритмы замещения страниц памяти(LRU, STL, gettimeofday)
мне предложили очередь из пар.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 21:36     STL, deque, pair #11
Visary_Master, а вопрос-то какой? Найти самый ранний элемент? Если да, то выше я показал как делать. Можно еще через лямбду, если допустимо использование C++11. Если нет, то какая проблема, я просто сути поста не уловил.
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.01.2012, 22:46  [ТС]     STL, deque, pair #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 просто все...
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 22:50     STL, deque, pair #13
Цитата Сообщение от Visary_Master Посмотреть сообщение
не компилится
Ошибки какие?

Цитата Сообщение от Visary_Master Посмотреть сообщение
Надо найти самое маленькое время(timeval), поменять ей время последнего обращения.
Пишете функтор для класса timeval и находите минимальное значение через min_element.
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.01.2012, 22:53  [ТС]     STL, deque, pair #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*>]()’
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 23:05     STL, deque, pair #15
Цитата Сообщение от Visary_Master Посмотреть сообщение
error: ‘dq’ has a previous declaration as ‘std::deque<int> dq
Раньше его объявили.
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.02.2012, 01:41  [ТС]     STL, deque, pair #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
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 02:07     STL, deque, pair #17
Ой, давайте лучше весь код. Похоже у вас не перегружен <<.
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.02.2012, 02:15  [ТС]     STL, deque, pair #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
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.02.2012, 02:27     STL, deque, pair #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()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2012, 02:44     STL, deque, pair
Еще ссылки по теме:

Своя реализация deque C++
STL, deque Перераспределение памяти C++
C++ STL deque

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

Или воспользуйтесь поиском по форуму:
Visary_Master
 Аватар для Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
01.02.2012, 02:44  [ТС]     STL, deque, pair #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);
?
Yandex
Объявления
01.02.2012, 02:44     STL, deque, pair
Ответ Создать тему
Опции темы

Текущее время: 11:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru