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

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

Войти
Регистрация
Восстановить пароль
 
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 272
#1

Странное поведение map в объкт-функции - C++

07.12.2011, 21:11. Просмотров 341. Ответов 6
Метки нет (Все метки)

есть класс
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
class writer
{
    map <string, list<string> > &dat;
    list<string> &all;
 
    bool flag; //true = familiya
    
public:
    writer( map <string, list<string> > &dat_, list<string> &all_): dat(dat_), all(all_)
    {
        flag = true;
    }
 
    void operator () (string s)
    {
        string Fam;
        if(flag)
        {
            Fam = s;
            list<string> :: iterator pb = all.begin();
            list<string> :: iterator pe = all.end();
            if (find(pb, pe, Fam) == pe)
            {
                all.push_back(Fam);
            }
            flag = !flag;
        }
        else
        {
            dat[s].push_back(Fam);
            flag = !flag;
        }
 
    }
};
вызов осуществляется так
C++
1
2
3
4
5
6
7
ifstream FS;
        FS.open(s);
map <string, list<string> > data;
list<string> all_stud;
 
 
        for_each(istream_iterator<string>(FS), istream_iterator<string>(), writer(data, all_stud));
вся проблема в том, что после вызова контейнер all_stud ЗАПОЛНЕН, а data заполнен, но не выводится!
щас поясню:
цикл
C++
1
2
3
4
5
6
7
8
for(auto it = data.begin(); it!= data.end(); ++it)
                 {
                     for(auto it1 = it->second.begin(); it1 != it->second.end(); ++it1)
                     {
                         cout<<' '<<*it1<<' ';
                     }
                     cout<<"987"<<'\n';
                 }
работает. Комбинация 987 выводится столько же раз, сколько элементов должно существовать. и Кол-во пробелов - тоже соответствует кол-ву элементов. А вот вызов
C++
1
*it1
не выводит НИЧЕГО! Я работаю с русским текстом. Проблем до этого момента не было. Переход на английский ничего не даёт, да и в списке all_stud всё выводится корректно...что такое?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2011, 21:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Странное поведение map в объкт-функции (C++):

Странное поведение функции - C++
Здравствуйте! Я взялась за реализацию метода Крылова для нахождения коэффициентов характеристического полинома. Написала программу, но...

Странное поведение функции работы с массивом(шаблон) - C++
Нужно написать функцию, которая из динамического массива удаляет все повторяющиеся элементы(остается только первый), массив сжимается.То...

Странное поведение new - C++
Объясните почему оператор new выделяет неверное количество памяти? # include &lt;iostream&gt; using namespace std; char* interpitator( int...

Странное поведение - C++
Здравствуйте еще раз :) Теперь возникла другая непонятка. Есть класс StringParser, объекты которого умеют разбивать строку на подстроки,...

Странное поведение cin - C++
Перегружаю оператор ввода следующим образом: #include &lt;iostream&gt; using namespace std; class Vector2D { public: ...

Странное поведение программы - C++
Здравствуйте, у меня проблема. В силу какой-то причины результатом вычисления выражения при значениях PA и PB равных 0 и 1 соответственно,...

6
gooseim
Эксперт С++
510 / 414 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
07.12.2011, 23:25 #2
Переход на английский ничего не даёт
Т.е. если в файле не русские символы, а английские, то тоже не выводит?
0
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 272
07.12.2011, 23:28  [ТС] #3
Именно так
И не в раскладке дело (иначе бы он не выдавал содержимое другого контейнера). Компилятор VS2010.
Обращение data["физика"] - тоже работает. В старой версии программы, где вместо for_each и объект функции для чтения использовался просто цикл - всё работало на ура....значит проблема в функции..
0
DU
1485 / 1131 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.12.2011, 23:37 #4
может дело в строке 30? пустая строка ведь в список запихивается постоянно.
0
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 272
07.12.2011, 23:49  [ТС] #5
Не понял вас)
может я не так понимаю процесс чтения в итераторе потока
файл структуры
ФАМИЛИЯ 'пробел' ПРЕДМЕТ
когда я читаю первый раз в s попадает ФАМИЛИЯ, когда второй раз "ПРЕДМЕТ", а 'пробел' воспринимается как разделитель и не читается в s. Если я прав, то в 30 строке проблем нет). и переменная Fam не бывает пустой. Если она пустая, то флаг стоит на True. Значит в ветку эсл не заходим...
Хотя самый первый раз...она всё же туда запихивается
0
DU
1485 / 1131 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.12.2011, 23:57 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
       void operator () (string s)
        {
                string Fam;
                if(flag)
                {
                        Fam = s;
                        list<string> :: iterator pb = all.begin();
                        list<string> :: iterator pe = all.end();
                        if (find(pb, pe, Fam) == pe)
                        {
                                all.push_back(Fam);
                        }
                        flag = !flag;
                }
                else
                {
                        dat[s].push_back(Fam);
                        flag = !flag;
                }
 
        }
Fam - локальная переменная, которая создается каждый раз, когда вызывается ф-ия. И создается она пустой. сделайте ее членом вашего врайтера - и тогда наверно получится то, что вы задумали.

И еще. Ваш writer - это функтор. Функтор с состоянимем. Функторы с состояниме делать не рекомендуется.
Маленькая оптимизация:
C++
1
void operator () (const string& s)
0
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 272
07.12.2011, 23:59  [ТС] #7
Да, спасибо. Раньше так и было...просто наверно сказывается отсутствие сна и "лучшее - враг хорошего". Решил кинуть её туда, чтобы более оптимизировать)))Спасибо
0
07.12.2011, 23:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2011, 23:59
Привет! Вот еще темы с ответами:

странное поведение fstream - C++
ниже представлен черновой код курсача. как из него видно я пытаюсь работать с файлами, но у меня ничего не выходит. а именно: я создаю...

Странное поведение присваивания - C++
class Lexem { public: uint id; uint value; uint line; uint pos; bool operator==(int a){ return a...

Странное поведение компилятора - C++
Всем привет! Я конечно понимаю что нужно выкладывать минимальный код повторяющий мою проблему но он будет достаточно грамосток т.к. в...

Странное поведение (сдвиг) - C++
Здравствуйте.Прошу помочь с задачкой. Программа , должна &quot;сдвигать&quot; данные в один бит(128), но при вызове функции с разными параметрами,...


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

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

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