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

Заполнить контейнер map и vector данными из файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.83
Beta
0 / 0 / 0
Регистрация: 06.12.2012
Сообщений: 9
06.12.2012, 15:16     Заполнить контейнер map и vector данными из файла #1
Текстовый файл содержит в себе информацию о пяти лифтах в виде:
12 900 first
10 600 second
15 700 third
20 1000 fourth
16 800 fifth
первое число-максимальный этаж, второе - максимальный вес, а слово - это название лифта.
Нужно считать эти данные , пользуясь библиотекой <fstream>,в контейнеры map и vector. Контейнер vector должен быть внутри map, т.е. ключ это название лифта, а значение(максимальный этаж и вес) содержит в себе vector.
Затем все вывести на экран. Вот мои наработки:
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
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <vector>
#include <iterator>
using namespace std;
int main(int argc,char*argv[])
{
    if (argc!=2)
    {
        cout<<"wrong format"<<endl;
        return -2;
    }
    
    
    map <string,vector<pair<int,int>>> Lift;
    vector<pair<int,int>> Section; 
 
    string lift_name;
    int floor,weight;
    map <string,vector<pair<int,int>>>::iterator m;
    vector<pair<int,int>>::iterator v;
    ifstream stream(argv[1]);
    if (!stream)
    {
        cout<<"error open file"<<endl;
        return -1;
    }
 
    
    while(!stream.eof())
    {
        
 
 
        for(v=Section.begin(); v!=Section.end(); ++v)
        {
            stream>>floor>>weight>>lift_name;
            Section.push_back(pair <int,int> (floor,weight));
            cout<<v->first<<" "<<v->second<<endl;
            
        }
 
        
 
 
        }
    stream.close();
    
    
    
    return 0;
}
Код компилируется, ошибок никаких не вылетает, но при отладке вылетает пустое черное окно, не могу понять, в чем тут дело?..И еще не могу понять как записать в map считанное значение имени лифта и заполненный vector. строка
C++
1
Lift.insert(lift_name);
дает ошибку при отладке.
строка
C++
1
Lift.insert(lift_name,pair<int,int> (floor,weight));
так же дает ошибку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
 Аватар для igorrr37
1594 / 1222 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
06.12.2012, 23:55     Заполнить контейнер map и vector данными из файла #2
вместо вектора пар можно взять пару
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 <string>
#include <utility>
#include <map>
#include <fstream>
#include <iomanip>
 
int main()
{
    std::ifstream ifs("in.txt");
    if(ifs.is_open())
    {
        std::map<std::string, std::pair<size_t, size_t>> map;
        std::string name;
        size_t floor, weight;
        while(ifs >> floor >> weight >> name)
        {
            map.insert(std::make_pair(name, std::make_pair(floor, weight)));
        }
        for(auto const& pair : map)
        {
            std::cout << std::setw(15) << std::left << pair.first << std::setw(6) << pair.second.first << pair.second.second << std::endl;
 
        }
        ifs.close();
    }
    else
        std::cerr << "Unable to open input file" << std::endl;
    return 0;
}
Beta
0 / 0 / 0
Регистрация: 06.12.2012
Сообщений: 9
07.12.2012, 22:11  [ТС]     Заполнить контейнер map и vector данными из файла #3
согласна, но мне нужно именно, чтоб вектор был, либо list, но все равно, вам большое спасибо.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
07.12.2012, 22:28     Заполнить контейнер map и vector данными из файла #4
Как вариант еще
C++
1
map[name] = {floor, weight};
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
07.12.2012, 22:34     Заполнить контейнер map и vector данными из файла #5
Цитата Сообщение от Beta Посмотреть сообщение
Контейнер vector должен быть внутри map, т.е. ключ это название лифта, а значение(максимальный этаж и вес) содержит в себе vector.
Глупость какая-то. Так?
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
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <string>
#include <utility>
#include <limits>
#include <cstdlib>
 
 
int main(int argc, char * argv[]) {
   if (argc != 2) {
      std::cerr << "Invalid argument(s). Filename expected." << std::endl;
      return EXIT_FAILURE;
   }
   
   std::ifstream ifs(argv[1]);
   if (!ifs) {
      std::cerr << "Could not open file '" << argv[1] << "' for reading." << std::endl;
      return EXIT_FAILURE;
   }
 //  std::istream & ifs = std::cin;
 
   typedef std::map<std::string, std::vector<int> >     map_type;
   map_type lifts;
   
   while (ifs) {
      int maxFloor;
      int maxWeight;
      std::string name;
 
      ifs >> maxFloor>> maxWeight >> name;
      ifs.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
      
      std::vector<int> data;
      data.reserve(2);
      data.push_back(maxFloor);
      data.push_back(maxWeight);
 
      lifts.insert(std::make_pair(name, data));
   }
 
   for (map_type::const_iterator it = lifts.begin(); it != lifts.end(); ++it) {
      std::cout << it->second[0] << '\t' << it->second[1] << '\t' << it->first << std::endl;
   }
}
http://ideone.com/IqPDJU
Beta
0 / 0 / 0
Регистрация: 06.12.2012
Сообщений: 9
07.12.2012, 23:04  [ТС]     Заполнить контейнер map и vector данными из файла #6
большое спасибо! все именно так как надо.

Добавлено через 1 минуту
только немного не понятно, что вот эта вот строчка делает:
C++
1
ifs.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
07.12.2012, 23:14     Заполнить контейнер map и vector данными из файла #7
Цитата Сообщение от Beta Посмотреть сообщение
что вот эта вот строчка делает:
Пропустить все символы в потоке до конца строки. Так то она здесь наверное не особо нужна, по привычке пишу)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 23:40     Заполнить контейнер map и vector данными из файла
Еще ссылки по теме:

C++ Контейнер map
C++ Чтение из файла в контейнер map
C++ Контейнер map

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

Или воспользуйтесь поиском по форуму:
Beta
0 / 0 / 0
Регистрация: 06.12.2012
Сообщений: 9
07.12.2012, 23:40  [ТС]     Заполнить контейнер map и vector данными из файла #8
Цитата Сообщение от gray_fox Посмотреть сообщение
Пропустить все символы в потоке до конца строки. Так то она здесь наверное не особо нужна, по привычке пишу)
понятно) но она нужна, без нее вывод на экран не совсем корректный.
без нее на экран выводится:
16 800
16 800 fifth
12 900 first
20 1000 fourth
10 600 second
15 700 third
Yandex
Объявления
07.12.2012, 23:40     Заполнить контейнер map и vector данными из файла
Ответ Создать тему

Метки
map, vector, данными, заполнить, контейнер, файла
Опции темы

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