Как применить концепцию подсчета вхождений в строковых переменных в C ++ - PullRequest
0 голосов
/ 01 февраля 2019

следующая программа может вычислить частоту в массивах, как применять эту концепцию к строковой переменной, поскольку строка также является массивом на внутреннем конце

using namespace std;
int counter[10]={0,0,0,0,0,0,0,0,0,0};
int arr [9][9],x;
int main()
{
    srand(time(NULL));

    cout<<"enter the array  \n";
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            arr[i][j]=rand()%10;
        }
    }

    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            cout<<arr[i][j]<<" ";
        }
        cout<<endl;
    }


    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            counter[arr[i][j]]++;

        }
    }

    for(int j=0;j<10;j++){
          cout<<j<<" : "<<  counter[j]<<endl;

        }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Если я правильно понимаю, вы хотите посчитать вхождения строк.Карта контейнера STL полезна для этой цели.Ниже приведен пример кода.

#include<iostream> 
#include<map> 
#include<string> 
#include<vector>                   

int main()
{
  std::vector<std::string> arrayString;
  std::map<std::string, int> counter;  
  std::map<std::string, int>::iterator it;

  arrayString.push_back("Hello");
  arrayString.push_back("World");
  arrayString.push_back("Hello");
  arrayString.push_back("Around");
  arrayString.push_back("the");
  arrayString.push_back("World");  

  // Counting logic
  for(std::string strVal : arrayString)
  {        
    it = counter.find(strVal);
    if(it != counter.end())
      it->second += 1; // increment count
    else    
      counter.insert(std::pair<std::string, int>(strVal, 1)); // first occurrence
  }

  // Results
  for(std::map<std::string, int>::iterator it = counter.begin(); it != counter.end(); ++it)  
    std::cout << it->first << ": " << it->second << std::endl;

  return 0;
}

Более компактный способ написания логики счета:

  // Counting logic
  for(std::string strVal : arrayString)
  {
    ++counter[strVal]; // first time -> init to 0 and increment
  }
0 голосов
/ 01 февраля 2019

Вот как можно подсчитать вхождения чего-либо из чего угодно:

Код

#include <iterator>
#include <map>
#include <algorithm>

template<class InputIt>
auto
occurrences(InputIt begin, InputIt end)
{
    std::map<typename std::iterator_traits<InputIt>::value_type, std::size_t> result;
    std::for_each(begin, end, [&result](auto const& item){ ++result[item]; });
    return result;
}

Использование

#include <string>
#include <iostream>

int main()
{
    auto text = std::string{"Hello, World!"};
    auto occ = occurrences(begin(text), end(text));
    std::cout << occ['l'] << '\n'; // outputs 3
}

Демонстрация в реальном времени

Пояснение

template<class InputIt>

Это универсальная (шаблонная) функция, повторяющаяся на любом входном итераторе.

auto

Тип возвращаемого значения выводится из его реализации.Оповещение о спойлере: это std::map of (счетчик значений, вхождение этого значения).

occurrences(InputIt begin, InputIt end)

occurrences вызывается с помощью пары итераторов, определяющих диапазон, обычно вызывающих begin(C) и end(C) на вашем контейнере C.

std::for_each(begin, end, //...

Для каждого элемента в диапазоне ...

[&result](auto const& item){ //...

... выполните следующую обработку ...

++result[item]; });

... увеличить счетчик вхождений для значения item, начиная с нуля, если оно является первым.

Это не реализация эффективного , поскольку она копирует значенияэто считается.Для целых чисел, символов, и т. Д. это идеально, но для сложных типов вы можете улучшить эту реализацию.

Это универсальный и стандартный контейнер, совместимый.Вы можете посчитать что-нибудь итерируемое.

...