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

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

Восстановить пароль Регистрация
 
Kadet89
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
21.02.2011, 19:05     Вопрос по контейнерам #1
Если я сделать вот так:
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;
}
А как работать с контенером, который в массиве структур?
Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2011, 19:05     Вопрос по контейнерам
Посмотрите здесь:

C++ Вопрос по if, else?
C++ Вопрос по #if
C++ вопрос
Вопрос C++
C++ Вопрос
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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)
//
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;
как тогда загонять и вынимать значения?
Спасибо.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
}
Пф. Туплю. Ща проверю в чем дело.
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, и как заполнять и вынимать её?
Спасибо
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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';
    }
}
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 не вставляя это в структуру?
Спасибо
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_)
        {
        }
? Впервые такое вижу
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.02.2011, 19:59     Вопрос по контейнерам #9
1-я строка - передача параметров по умолчанию
2-я строка - иницилизация полей структуры
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;
};
?
Mr.X
Эксперт С++
 Аватар для Mr.X
2804 / 1580 / 247
Регистрация: 03.05.2010
Сообщений: 3,675
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());
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.02.2011, 21:40     Вопрос по контейнерам #12
Kadet89, Меня ставят в ступор вопросы от людей которые пользуются unordered_map и прочими контейнерами, не зная классов, конструкторов, списков инициализации... Или я в чем-то ошибаюсь насчет незнания?
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2011, 22:40     Вопрос по контейнерам
Еще ссылки по теме:

C++ Вопрос
Вопрос C++
Задача по контейнерам stl vector и list C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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.
}
Так более понятно?
Yandex
Объявления
22.02.2011, 22:40     Вопрос по контейнерам
Ответ Создать тему
Опции темы

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