Использование find () в векторе карт, C ++ - PullRequest
0 голосов
/ 08 мая 2020

Для моего класса мне нужно найти использование следующей структуры: vector<map<int, map<char, float>>>

Моя идея состояла в том, чтобы создать базовый c метод шифрования, вывод которого зависит от даты использования (каждый день есть своя кодировка символов в течение года). Внешний map из vector представляет месяцы, а ключ int этих карт представляет дни.

Конструкция использует файл , где каждая строка имеет В списке указано AB C, и каждой букве соответствует номер, разделенный точкой с запятой.

Мой код работает, но обеспечивает шифрование только для 1 числа каждого месяца, независимо от того, какую дату он получает. Оператор << работает нормально.

class CodeCollection{
    vector<map<int, map<char, float>>> coding_of_the_day;

public:
    CodeCollection(string path){
        ifstream fin(path);
        if(!fin.is_open()){
            cerr << "Nope" << endl;
            exit(432);
        }
        for(size_t j = 0; j < month_lenght.size(); ++j){ 
            int day = 1;
            map<int, map<char, float>> month;
            for(int i = 0; i < month_lenght[j]; ++i){
                map<char, float> char_value;
                char c, tmp;
                float f;
                string abc_coding;
                while(getline(fin, abc_coding)){
                    stringstream ss;
                    ss << abc_coding;
                    int counter = 1;
                    while(ss.good()){
                        ss >> c >> tmp >> f >> tmp;
                        char_value.emplace(c, f);
                        cout << c << f << " " << day << counter << endl;
                        counter++;
                    }
                    month.emplace(day, char_value);
                    day++;
                }
            }
            coding_of_the_day.push_back(month);
        }
        fin.close();
    }

    friend ostream& operator<<(ostream& out, map<int, map<char, float>>& monthly){
        for(auto const& first_key : monthly){
            out << first_key.first;
            for(auto const& second_key : first_key.second){
                out << second_key.first << " = " << second_key.second << ", ";
            }
            out << endl;
        }
        return out;
    }

    ofstream codegenerator(string message, int month, int day){
        ofstream fout("code.txt");
///I suppose  my flaw is here:
        map<int, map<char, float>>::iterator it = coding_of_the_day[month-1].find(day); 
        for(size_t i = 0; i < message.size(); ++i){
            map<char, float>::iterator ite = it->second.find(message[i]);
            fout << ite->second << ".";
        }
        return fout;
    }
};

Заранее благодарим за любое решение.

1 Ответ

0 голосов
/ 08 мая 2020

Вы не тестировали свой конструктор. Здесь:

for(int i = 0; i < month_lenght[j]; ++i){
  map<char, float> char_value;
  ...
  char_value.emplace(c, f);
  ...
  month.emplace(day, char_value);
  day++;
}

Проблема в том, что emplace не перезаписывается, а откладывает на предыдущие значения. Если вы попытаетесь emplace ввести запись с ключом, для которого уже есть запись на карте, новый элемент отбрасывается. Итак, если вам присвоено значение 'a' в char_value для дня 1, вы не сможете изменить его для дня 2.

Легко решить:

for(int i = 0; i < month_lenght[j]; ++i){
  char_value.clear();
  ...
...