2017-02-13 11 views
0

В основном я пытаюсь найти режим в векторе, например, если вектор равен 1 1 1, он просто не возвращает никакого режима. также он должен уметь читать до двух возможных режимов, о которых сказал профессор, чтобы не беспокоиться о более чем двух режимах. Любые предложения были бы очень полезными. Также void calcMode является частью этого, он не позволит мне добавить его в код, который я не знаю, как его изменить.Попытка прочитать несколько режимов в вектор, а затем распечатать их C++

void calcMode(vector <double> const& vec) 
{ 
    int counter = 1; 
    int max = 0; 
    vector<double> mode; 
    for (int pass = 0; pass < vec.size() - 1; pass++) 
     { 
      if (vec[pass] == vec[pass + 1]) 
      { 
       counter++; 
       // If they are the same number add it to the mode vector 
       if (counter > max) 
       { 
        mode.clear(); 
        max = counter; 
        mode.push_back(vec[pass]); 
       } 
       // if it is greater clear the vector and assign it the new value 
       else if (counter == max) 
       { 
        mode.push_back(vec[pass]); 
       } 

      } 
      else 
       counter = 1; // reset counter. 
     } 
    // print out the freq and the mode(s) 
    cout << mode.size() << endl; 
    cout << "Mode: " << setw(25) << setprecision(3); 

    cout << setw(25) << setprecision(3); 

    if (vec.size() == 1) 
    { 
     cout << "Freq = " << counter << endl; 
     cout << vec[0] << endl; 
    } 
    else if (vec.size() == 2) 
    { 
     cout << "Freq = " << counter << endl; 
     cout << vec[0] << vec[1] << endl; 
    } 
    else 
     cout << "No mode" << endl; 
} 
+0

Быстрый хак: 'станд :: Карта частота;' С этой маленькой красоты вы можете 'частота [VEC [индекс]] ++;', чтобы получить частоту подсчет всех элементов в «векторе». Затем просто переходите через 'freq', ища самые высокие (или два самых высоких) счета. Функция выполняется в 5-6 строках кода. – user4581301

+0

Помимо этого, выберите одну проблему и сосредоточьте внимание на этой проблеме. В противном случае вы собираете голоса, близкие голоса и фрагментированные ответы. Ничто из этого не стоит вашего времени. – user4581301

+0

Спасибо за ответ, я пробовал свой метод, он считает самые высокие значения, но как я могу отображать самые высокие? Как если бы это было 20 20 10 11, частота была бы 2, но как распечатать 20? –

ответ

0

Использование стандартной библиотеки, где это возможно, и где это имеет смысл.

#include <iostream> 
#include <vector> 
#include <map> 
#include <algorithm> 

// comparator function. When you compare two std::pair, you get both sides 
// in the compare. We only want the value side, so we define a function to 
// only test the value side. 
static bool comp(std::pair<unsigned,unsigned> lhs, 
       std::pair<unsigned,unsigned> rhs) 
{ 
    return (lhs.second < rhs.second); 
} 

int main() 
{ 
    std::vector <double> const& vec {0, 1, 1, 2, 2, 4, 3, 2, 4, 0, 1, 3}; 
    std::map<double, int> freq; 

    // build frequency count 
    for (double val:vec) 
    { 
     freq[val]++; 
    } 
    // or 
    //std::for_each(vec.begin(), vec.end(), [&freq](double val){ freq[val]++; }); 
    // not sure if using for_each makes sense here. I don't think we get much 

    // find highest frequency 
    std::map<double, int>::iterator found = std::max_element(freq.begin(), 
                  freq.end(), 
                  comp); 
    // cache what we found so we have it later 
    std::pair<double, int> mode = *found; 
    std::cout << found->first << " freq: " << found->second << '\n'; 
    // remove so we don't find again 
    freq.erase(found); 

    // look for next highest frequency 
    found = std::max_element(freq.begin(), freq.end(), comp); 
    // test for same frequency 
    if (mode.second == found->second) 
    { 
     std::cout << found->first << " freq: " << found->second << '\n'; 
    } 
} 

std::max_element documentation

std::for_each documentation

+0

Спасибо, ваш метод работает как шарм. –