Не найти события, как предполагалось

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

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

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

  • 0: 8 произошло 1 раз% x
  • 2: 3 произошло 3 раза% x
  • 9: 5 произошло 2 раза% x
  • 8: 9 произошло 1 раз% x

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

  • 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;
}

-2

Решение

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

Теперь вместо написания своих собственных функций для получения номера каждого вхождения вы можете использовать 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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]