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

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

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

STL, deque, pair - C++

31.01.2012, 13:30. Просмотров 4599. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос 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++
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

60
Mayonez
380 / 272 / 21
Регистрация: 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
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.01.2012, 15:09  [ТС] #3
C++
1
2
timeval tv;
gettimeofday(&tv, NULL);
Так буду использовать примерно.
библиотеку не помню, сейчас на винде
0
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
31.01.2012, 15:38 #4
Visary_Master, find_if(), но лучше сразу min с предикатом
1
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
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
380 / 272 / 21
Регистрация: 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
2542 / 1307 / 81
Регистрация: 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
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
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
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 21:17 #9
Visary_Master, Тогда перегружаете оператор сравнения с двумя параметрами.
Или в Comp перегружаете скобки, в которых вручную сравниваете 2 объекта. В этом случае можно не перегружать <
1
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
31.01.2012, 21:24  [ТС] #10
я просто параллельно завел тему:
Алгоритмы замещения страниц памяти(LRU, STL, gettimeofday)
мне предложили очередь из пар.
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 21:36 #11
Visary_Master, а вопрос-то какой? Найти самый ранний элемент? Если да, то выше я показал как делать. Можно еще через лямбду, если допустимо использование C++11. Если нет, то какая проблема, я просто сути поста не уловил.
1
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
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
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
31.01.2012, 22:50 #13
Цитата Сообщение от Visary_Master Посмотреть сообщение
не компилится
Ошибки какие?

Цитата Сообщение от Visary_Master Посмотреть сообщение
Надо найти самое маленькое время(timeval), поменять ей время последнего обращения.
Пишете функтор для класса timeval и находите минимальное значение через min_element.
1
Visary_Master
-154 / 16 / 4
Регистрация: 01.12.2010
Сообщений: 297
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
2542 / 1307 / 81
Регистрация: 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
31.01.2012, 23:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2012, 23:05
Привет! Вот еще темы с ответами:

Как считать данные в 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.Не сохраняя всей последовательности в...


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

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

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