2017-01-16 3 views
-1

Я хочу, чтобы он читал по 1 строке за раз и подсчитывал, сколько раз строка появляется после запятой, например, если появляется A, есть счетчик + = 1, и если B появляется там отдельный счет + = 1, а затем делать то же самое с другая строка, и если он появится twices больше, чем в первой строке, чем сохранить егокак мы можем считать или сравнить строки?

Ex:

string num1 = "A, B , C, AB, AC" 
string num2 = "A, B, C , AB, A, C, AC, AB" 
istringstream uc(num2); 
string num3 
while(getline(uc,num3,',')) //get part of the string after you see ',' 
{ 


} 

результат: так как они появляются дважды

C, AB , A 
+0

Сначала вы можете попробовать написать полный код, а затем задать более конкретный вопрос, если вам по-прежнему нужна помощь. – Nagev

+0

Я не уверен, как я могу сделать отдельный счет для каждой строки. – user58504

ответ

1

Во-первых, я бы создать функцию, которая подсчитывает количество вхождений каждого слова в строке. Я бы, вероятно, сохранил эту информацию в std::map, так как это довольно удобно.

Тогда я просто перечислил числа для num2, и если он больше, чем число для num1, я бы напечатал строку.

Это может выглядеть примерно так:

#include <iostream> 
#include <map> 
#include <regex> 
#include <string> 

std::map<std::string, int> StringCounts(std::string input) { 
    static const std::regex re(" *, *"); 
    std::map<std::string, int> counts; 
    for (std::sregex_token_iterator it(input.begin(), input.end(), re, -1); 
      it != std::sregex_token_iterator(); 
      ++it) 
     counts[*it]++; 
    return counts; 
} 

int main() { 
    const std::string num1 = "A, B , C, AB, AC"; 
    const std::string num2 = "A, B, C , AB, A, C, AC, AB"; 

    auto counts1 = StringCounts(num1); 
    auto counts2 = StringCounts(num2); 

    for (auto pair : counts2) { 
     const std::string &word = pair.first; 
     if (counts2[word] > counts1[word]) 
      std::cout << word << ", "; 
    } 
    std::cout << "\n"; 
} 

Каких выходы:

A, AB, C, 

Если мы заботились о производительности, мы могли бы отметить, что мы перебор карты огромного количества раз. Мы могли бы переписать этот цикл в O (n), но я оставлю это как упражнение для читателя.

+0

regex кажется настолько странным и немного запутанным для использования в C++. По крайней мере, на первый взгляд ... и на второй ... – bolov

+0

немного nitpick: вместо 'counts2 [word]' вы можете использовать 'pair.second', чтобы избежать второго избыточного поиска. По крайней мере, C++ 17 исправляет это с помощью 'for (auto [word2, count2]: counts2)'. В любом случае +1. – bolov

+0

@bolov: Я мог бы также использовать 'std :: tie' в более ранних версиях C++. –

Смежные вопросы