Порой из-за того, что вопрос на
Stackoverflow сформулирован начинающим программистом плохо, изначальный ответ на вопрос может решать не ту задачу, которую нужно решить начинающему программисту.
Так получилось и с этим вопросом
C++ For Loop got skipped in the middle of the process. How to fix it? В результате мой ответ содержит решение двух задач вместо одной.
Из кода программы, которая не имеет большого смысла, проведенного в вопросе, трудно понять, что на самом деле начинающий программист пытается сделать.
Поэтому сначала я понял задачу так, как "
найти количество уникальных элементов в массиве".
Предполагается, что исходный массив нельзя изменять. Из чего следует, что нельзя применить сортировку к исходному массиву.
Решить поставленную задачу очень просто с использованием стандартного контейнера
std::set или
std::unordered_set.
Вот код соответствующей программы.
#include <iostream>
#include <set>
#include <iterator>
int main()
{
int a[] = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };
size_t total = std::set<int>( std::begin( a ), std::end( a ) ).size();
std::cout << total << '\n';
return 0;
}
Этот подход требует дополнительных ресурсов памяти, так как создается объект класса
std::set<int> совместно с заносимыми в него элементами массива.
Если требуется решить задачу без использования дополнительных ресурсов памяти, то можно это сделать с помощью вложенных циклов, как показано ниже.
#include <iostream>
int main()
{
int a[] = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t total = 0;
for ( size_t i = 0; i < N; i++ )
{
size_t j = 0;
while ( j != i && a[j] != a[ i ] ) j++;
if ( j == i ) ++total;
}
std::cout << total << '\n';
return 0;
}
В обоих случаях вывод на консоль будет
4
так как в массиве, используемом в качестве примера, имеется ровно
4 уникальных элемента.
А
как найти количество пар одинаковых элементов (что на самом деле требовалось автору вопроса)?
Опять-таки, это можно сделать двумя способами: с использованием стандартного контейнера и при помощи вложенных циклов.
На этот раз в качестве контейнера будет использовать стандартный контейнер
std::map (или можно использовать
std::unordered_map) Вот программа, в которой используется контейнер
std::map.
#include <iostream>
#include <map>
int main()
{
int a[] = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };
size_t total = 0;
std::map<int, size_t> m;
for ( const auto &item : a ) ++m[item];
for ( const auto &item : m ) total += item.second / 2;
std::cout << total << '\n';
return 0;
}
А эта программа решает ту же самую задачу с помощью вложенных циклов.
#include <iostream>
int main()
{
int a[] = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t total = 0;
for ( size_t i = 1; i < N; i++ )
{
size_t count = 1;
for ( size_t j = 0; j < i; j++ )
{
if ( a[ i ] == a[j] ) ++count;
}
if ( count % 2 == 0 ) ++total;
}
std::cout << total << '\n';
return 0;
}
На этот раз в обоих случаях вывод на консоль будет
3
так как в массиве содержится ровно 3 пары одинаковых элементов.
Думаю, это хороший учебный пример для начинающих программистов.
