2016-04-20 2 views
-2

У меня есть следующая программа, целью программы является отображение того, сколько раз каждое значение в векторе списка произошло.Не найти места, как предназначено

если кортеж 2: 3 встречается 3 раза в векторе, программа показывает это пользователю.

Ожидаемые результаты

  • 0: 8 произошло 1 раз% х
  • 2: 3 произошло 3 времени% х
  • 9: 5 произошло 2 Время% х
  • 8: 9 произошло 1 раз% х

фактический выход:

  • 2: 3 произошло 3% Время 42
  • 8: 9 произошло 1 раз 14%
  • 9: 5 произошло 3% времени, 42

Любая идея, что я делаю неправильно ? Вот полная и поддающаяся проверке рабочая версия кода, который я использую

Любая помощь очень ценится.

#include <vector> 
    #include <iostream> 
    #include <tuple> 

    using namespace std; 
    int counter = 0; 
    double percentage; 
    int val = 0; 
    vector<tuple<int, int>> list = { make_tuple(2, 3), make_tuple(0, 8), make_tuple(2, 3), make_tuple(8, 9), make_tuple(9, 5), make_tuple(9, 5), make_tuple(2, 3) }; 


     int binarysearch(vector<tuple<int, int>> list, int low, int high, tuple<int, int> number) 
     { 
      int index = low; 
      int mid = 0; 
      // loop till the condition is true 
      while (low <= high) { 
       // divide the array for search 
       mid = (low + high)/2; 

       if (list.at(mid) > number) { 
        high = mid - 1; 

       } 
       else { 
        low = mid + 1; 
       } 

      }return (high - index + 1); 

     } 

     int main() 
     { 

      while (counter <= list.size() - 1) { 

       val = binarysearch(list, counter, list.size() - 1, list.at(counter)); 
       percentage = val * 100/list.size(); 
       cout << "Value: " << get<0>(list.at(counter)) << ":" << get<1>(list.at(counter)) << " Occurs: " << val << " Time(s)" << " %" << percentage << endl; 
       counter += val; 
      } 



      return 0; 
     } 
+1

возражали пошагового ваш код с отладчиком? –

+0

ничего, что я могу видеть, посмотрел несколько раз. – Mitch89

+0

Я голосую, чтобы закрыть это, прося общую помощь по отладке и не делать это самостоятельно, вместо этого спрашивая о SO, затем удаляя Q, чтобы спросить следующий Q, пока вы его не сделаете (присваивание?). –

ответ

1

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

Теперь вместо того, чтобы писать свои собственные функции, чтобы получить число в каждом случае вы можете использовать std::map, чтобы сделать это для вас, как

std::vector<std::tuple<int, int>> list = { make_tuple(2, 3), make_tuple(0, 8), make_tuple(2, 3), make_tuple(8, 9), make_tuple(9, 5), make_tuple(9, 5), make_tuple(2, 3) }; 
std::map<std::tuple<int, int>, int> occurrences; 
for (const auto& e : list) // go though the vector and add to the map. increment the value on duplication 
    ++occurrences[e]; 

for (const auto& e : occurrences) 
{ 
    double percentage = e.second * 100/list.size(); 
    cout << "Value: " << get<0>(e.first) << ":" << get<1>(e.first) << " Occurs: " << e.second << " Time(s)" << " %" << percentage << endl; 
} 

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

Value: 0:8 Occurs: 1 Time(s) %14 
Value: 2:3 Occurs: 3 Time(s) %42 
Value: 8:9 Occurs: 1 Time(s) %14 
Value: 9:5 Occurs: 2 Time(s) %28 
+0

Я использовал сортировку пузыря, чтобы отсортировать массив, затем я использовал свой бинарный поиск, и он сработал. В следующий раз я возьму карты. – Mitch89

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