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

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

Войти
Регистрация
Восстановить пароль
 
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
#1

Вопрос по контейнерам - C++

21.02.2011, 19:05. Просмотров 957. Ответов 13
Метки нет (Все метки)

Если я сделать вот так:
C++
1
2
3
4
5
6
7
struct mag
{
char adr[255];
int zarpl_za_den;
std::vector<std::string> vect;
std::unordered_map<std::string, int> mapmassiv;
}mas[100];
Т.е. помещу контейнеры map и vector в статический массив структур, то я не совсем представляю себе как работать с контейнерами?

Еслиб контейнер был не в массиве структур, то я делал бы так:
добавляем элемент:
C++
1
mapmassiv["значение1"] = std::make_pair("значение2", 10);
Вынимаем элементы:
C++
1
2
3
4
for (std::unordered_map<std::string, int>::iterator it = mapmassiv.begin(); it != mapmassiv.end(); ++it) {
    int d = it->second.first.first.size(); // Получаем размер
    std::cout << "\n\nЗначение1: " << it->first << "\nЗначение2: " << it->second.first << "\nЗначение3: " <<it->second.second << " " << std::endl;
}
А как работать с контенером, который в массиве структур?
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2011, 19:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос по контейнерам (C++):

Литература по контейнерам - C++
Всем добрый вечер. Посоветуйте, пожалуйста, какую-нибудь литературу по контейнерам :c

Параллельный доступ к контейнерам STL - C++
Читаю Джосаттиса - Стандартная библиотека C++. Справочное руководство - 2014, стр 84. Написано: Не могу понять. Если параллельный...

Задача по контейнерам stl vector и list - C++
Дан сортированный по убыванию массив int'ов размером 100 элементов. Значение начального максимального элемента a, минимального b. На вход...

Каким образом обычно организуется доступ к контейнерам в классе? - C++
Каким образом обычно организуется доступ к контейнерам в классе если для них давать модификатор private? То есть хочется иметь объекты...

Вопрос по массивав, "институтский" вопрос. - C++
Готовлюсь к летней сессии по программированию. С++ Есть такая вот задачка (привожу как есть) В документации подобного не...

Принадлежность к контейнерам - Delphi
Здравствуйте! Помогите пожалуйста разобраться! Суть вот в чем : Есть Frame, на нем размещен PageControl, на одном из табов размещены пара...

13
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
21.02.2011, 19:15 #2
Kadet89,
C++
1
 mas[0].mapmassiv["blablabla"]=std::make_pair<std::string, int>("blabla", 0);
C++
1
2
for(std::unordered_map<std::string, int>::iterator it=mas[0].mapmassiv.begin(); it != mas[0].mapmassiv.end(); ++it)
//
1
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
21.02.2011, 19:27  [ТС] #3
Ещё такой вопрос, я в контейнере map могу использовать pair - чтобы одному ключу соответствовало к примеру 2 значения. Я могу в pair воткнуть ещё 2 pair'а и тогда получится одному ключу соответствует уже 4 значения. Если ещё пихать pair в pair - то вроде как можно сделать неограниченное количество элементов, но запись в таком случае выглядит просто ужасно.
Такой вопрос, можно ли в map использовать структуру?
И ещё один вопрос, если я использую pair:
C++
1
std::unordered_map<std::string, std::pair<std::string, std::string>> mapmassiv;
как тогда загонять и вынимать значения?
Спасибо.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
21.02.2011, 19:35 #4
Kadet89, Можно использовать структуру конечно... Я с unordered не работал...

А с обычным...
C++
1
2
3
4
5
6
7
8
std::multimap<std::string, std::pair<std::string, std::string> > MP;
MP.insert(std::make_pair<std::string, std::pair<std::string, std::string>("Hello", std::make_pair<std::string, std::string>("End", "What"));
MP.insert(std::make_pair<std::string, std::pair<std::string, std::string>("Hello", std::make_pair<std::string, std::string>("Bye", "No"));
for(std::multimap<std::string, std::pair<std::string, std::string> >::iterator iter=MP.begin();
iter != MP.end(); ++iter)
{
    std::cout<<"Key: "<< iter.first <<" First value: "<< iter.second.first <<" Second value: "<< iter.second.second;
}
Пф. Туплю. Ща проверю в чем дело.
1
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
21.02.2011, 19:45  [ТС] #5
Ммм, если можно воткнуть структуру, тогда я не вижу смысла в pair... да и с самого начала не надеялся на него, в любом случае запутаюсь, мне нужно 14 элементов сопоставить ключу, получилось бы нечто огромное и ужасное...
Тогда уж сразу добью тему...
Хочу сделать чтобы ключу соответсвовала структура. Сделал вот так:
C++
1
2
3
4
5
6
7
struct magazin
{
char adr[255];
int zarpl_za_den;
int vaban;
}
std::map<int, magazin> mapmassiv;
(выглядит всё просто и понятно, и коротко, в отличае от pair)
Не заработало и вполне очевидно...
Как правильно загнать структуру в map, и как заполнять и вынимать её?
Спасибо
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
21.02.2011, 19:53 #6
Ненавижу такие конструкции... Сейчас скажу как.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <map>
#include <string>
 
int main()
{
    std::multimap<std::string, std::pair<std::string, std::string> > MP;
    MP.insert(std::make_pair<std::string, std::pair<std::string, std::string> >("Hello", std::pair<std::string, std::string>("Bye", "End")));
    MP.insert(std::make_pair<std::string, std::pair<std::string, std::string> >("Hello", std::pair<std::string, std::string>("Hello", "What")));
    for(std::multimap<std::string, std::pair<std::string, std::string> >::iterator iter=MP.begin();
    iter != MP.end(); ++iter)
    {
        std::cout<<"Key: "<< iter->first <<" First value: "<< iter->second.first<<" Second value: "<<iter->second.second<<'\n';
    }
}
Добавлено через 5 минут
Мини-пример на тему структур.

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
#include <iostream>
#include <map>
#include <string>
 
struct some
{
    some(int a_=0, int b_=0)
        :a(a_), b(b_)
    {
    }
    int a;
    int b;
};
 
std::ostream& operator <<(std::ostream& os, const some& one)
{
    os<<one.a<<' '<<one.b<<'\n';
    return os;
}
 
int main()
{
    std::multimap<int, some> MP;
    MP.insert(std::make_pair<int, some>(5, some(1, 2)));
    MP.insert(std::make_pair<int, some>(10, some(3, 5)));
    for(std::multimap<int, some>::iterator iter=MP.begin(); iter != MP.end(); ++iter)
    {
        std::cout<<"Key: "<< iter->first <<" Value: "<< iter->second <<'\n';
    }
}
1
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
22.02.2011, 17:55  [ТС] #7
Большое спасибо

Добавлено через 21 час 54 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <map>
#include <string>
 
struct magazin
{
        int a;
        int b;
        char c;
};
 
int main()
{
    std::multimap<int, magazin> MP;
    MP.insert(std::make_pair<int, magazin>(5, magazin(1, 2, 3)));
    return 0;
}
При компиляции:
error: no matching function for call to ‘magazin::magazin(int, int)’
Если вставить это:
C++
1
2
3
4
        some(int a_=0, int b_=0)
                :a(a_), b(b_)
        {
        }
Ошибка пропадает, но я пока не определил что это и запись получается довольно большая и неаккуратная.
Можно ли сделать insert не вставляя это в структуру?
Спасибо
0
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
22.02.2011, 19:57 #8
А что вообще в структуре выполняет это:
C++
1
2
3
4
some(int a_=0, int b_=0)
                :a(a_), b(b_)
        {
        }
? Впервые такое вижу
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.02.2011, 19:59 #9
1-я строка - передача параметров по умолчанию
2-я строка - иницилизация полей структуры
0
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
22.02.2011, 20:14  [ТС] #10
А почему такая схема работает только так:
C++
1
2
3
4
5
6
7
8
9
struct some
{
        some(int a_=0, int b_=0)
                :a(a_), b(b_)
        {
        }
        int a;
        int b;
};
Почему нельзя просто:
C++
1
2
3
4
5
struct some
{
        int a;
        int b;
};
?
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
22.02.2011, 20:53 #11
Вот так можно:
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
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_shop
{
    T_str  adr;
    int    zarpl_za_den;
    int    vaban;
    //-----------------------------------------------------------------------------------
    void  print()
    {
        std::cout << std::setw(20)
                  << std::left
                  << "Адрес:"
                  << '\t'
                  << adr
                  << std::endl
                  << std::setw(20)
                  << "Зарплата за день:"
                  << '\t'
                  << zarpl_za_den
                  << std::endl
                  << std::setw(20)
                  << "vaban:"
                  << '\t'
                  << vaban
                  << std::endl;
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::map<int, T_shop>  T_shops;
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
 
    T_shops  shops;
        
    shops[1].adr           = "За углом";
    shops[1].zarpl_za_den  = 1000;
    shops[1].vaban         = 2;    
    
    shops[2].adr           = "Недалеко.";
    shops[2].zarpl_za_den  = 2000;
    shops[2].vaban         = 6;    
 
    struct T_print_key_and_shop
    {
        void  operator() (T_shops::value_type  key_and_shop)
        {
            std::cout << std::endl
                      << std::endl
                      << "Магазин № "                      
                      << key_and_shop.first
                      << std::endl
                      << T_str(12, '=')                      
                      << std::endl;
            key_and_shop.second.print();            
        }
    };
 
    std::for_each(shops.begin(), shops.end(), T_print_key_and_shop());
}
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
22.02.2011, 21:40 #12
Kadet89, Меня ставят в ступор вопросы от людей которые пользуются unordered_map и прочими контейнерами, не зная классов, конструкторов, списков инициализации... Или я в чем-то ошибаюсь насчет незнания?
0
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
22.02.2011, 22:06  [ТС] #13
ForEveR по всей видимости частично да, но пытаюсь здесь исправить это
C++
1
2
3
4
5
6
7
8
9
 struct some
{
        some(int a_=0, int b_=0)
                :a(a_), b(b_)
        {
        }
        int a;
        int b;
};
Мне тут уже пояснили:
строка 3 - передача параметров по умолчанию.
строка 4 - иницилизация полей структуры

Правильно я понял что в данном коде делается только одно - a и b в структуре по умолчанию становятся равны нулю? Тогда непонятно зачем нужны строки 7 и 8, и почему не работает insert
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
22.02.2011, 22:40 #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 struct some
{
        //Конструктор с параметрами по умолчанию
        some(int a_=0, int b_=0)
                //инициализация полей структуры значениями
                :a(a_), b(b_)
        {
        }
        //Поля структуры. Два целых числа.
        int a;
        int b;
};
 
int main()
{
    some one(2, 3);//Создан объект one в котором поле a=2, поле b=3.
    some second;//Создан объект second в котором оба поля равны нулю
    some third(5);//Создан объект third в котором поле a=5, поле b=0.
}
Так более понятно?
2
22.02.2011, 22:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2011, 22:40
Привет! Вот еще темы с ответами:

Как биндить к контейнерам (например DataGrid) какие то коллекции из кода? - C# WPF
как вообще биндить к контейнерам (например DataGrid) какие то коллекции из кода? я имею ввиду не установкой DataSource из кода C#, а я...

Нужна информация по видео форматам (MPEG,WMV,ASF) и видео контейнерам (AVI,MP4,OGM) - Видеопрограммы
Доброе время суток, дорогие форумчание. Мне для работы очень нужна следующая инфа по видео форматам (MPEG,WMV,ASF) и видео контейнерам...

Вопрос по SetParent (поэтому, наверное, это вопрос к NickStaves) - Visual Basic
Есть набор форм, назовём их 'интерфейсными'. Есть отдельная форма, назовём её 'хранилищем'. Сама по себе она нигде не используется: лишь...

[ВОПРОС]: Меню и вопрос при регистрации - VBulletin
Помогите пожалуйста. У меня vbulletin 4.0.7 и после установки в верхнем меню есть лишняя навигация. Например: Главная Форум Blogs ...


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

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

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