Подсчет количества повторений в отсортированном текстовом файле C

#c #while-loop #binary-search-tree #ifstream #sstream

#c #цикл while #двоичное дерево поиска #ifstream #sstream

Вопрос:

У меня есть файл, который выглядит следующим образом:

a
a
a
a
b
b
c
d
d
d

Я использую fstream и sstream чтобы прочитать его, и чего я хочу добиться-это, чтобы прочитать это подсчитывать, сколько раз один элемент повторяется, так что я могу добавить узел в по британскому летнему времени с повторением считать своим ключом.

Я надеюсь добиться чего-то подобного:

 myBST.insert("a", 4);
myBST.insert("b", 2);
myBST.insert("c", 1);
myBST.insert("d", 3);
  

Я попытался создать цикл while с новым sstream, где основной цикл находит элемент, подсчитывая, сколько раз значение, считываемое новым sstream, совпадает с исходным sstream, но, похоже, это не работает:

     if (!datos.is_open())
    {
        cout << "failed to open";
    }

    string line;
    
    while (getline(datos, line))
    {
        stringstream ss(line);

        int count = 0;

        string line2 = line;
        stringstream ss2(line2);
        while (line2 == line)
        {
            stringstream ss2(line2);
            count  ;
        }       
        
    }
    return 0;
  

Любая помощь приветствуется 🙂

Комментарии:

1. Вы могли бы использовать, например std::unordered_map , для отслеживания «повторений». Используйте входные данные из файла в качестве ключа, а счетчик — в качестве данных. Тогда вы можете просто сделать map[line] . А затем выполните итерацию по карте, и у вас будут строки и повторения.

2. Это может сработать, но я также должен отслеживать, когда он перестает повторяться

3. я также должен отслеживать, когда он перестает повторяться , это именно то, чего map[line] можно достичь. Всякий раз, когда происходит неповторение line map[line] , будет вставляться новое std::pair(line, 0); , которое затем увеличивается в первый раз. Пожалуйста, прочитайте еще раз, как работает std::unordered_map::operator[] : Возвращает ссылку на значение, которое сопоставляется с ключом, эквивалентным ключу, выполняя вставку, если такой ключ еще не существует.

4. я также должен отслеживать, когда он перестает повторяться , или это означает, что вы хотите что-то сделать в этом случае (например, сохранить или распечатать номер текущей строки)? Это также просто: if ( map[line] == 1) { /* non-repeated line occurred */ } .

5. Если вы хотите сохранить порядок сортировки, я бы предпочел std::map over std::unordered_map : Demo на coliru