В вашем коде есть несколько проблем.
В
it = ser1.begin();
for (i = 0; i < n; i++)
{
ser1.erase(it);
вы инициализируете итератор для цикла for.Тогда вы звоните erase
.Как вы можете прочитать в cppreference , стирание
"Делает недействительными итераторы и ссылки в или после точки удаления, включая итератор end ()."
Может быть даже нормально в вашем случае, потому что вы никогда не увеличиваете итератор.Это означает, что вы всегда стираете первый элемент.Итак, 2 ошибки.Это не будет работать.
Вы также используете неправильный тип данных для среднего значения.
Пожалуйста, прочитайте также комментарии под вашим постом.В основном все, что уже упоминалось.
Я покажу вам еще 2 предложения, как может выглядеть код.
Первая версия проверяет, возможно ли сокращение.
Вторая версия делает этомногократное сокращение цикла.
Версия 1:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>
using NumberType = int;
constexpr size_t MinNumberOfValuesToCheck = 1;
constexpr size_t MaxNumberOfValuesToCheck = 20;
int main()
{
// Read the number of values to check
std::cout << "How many vaues shall be checked? Please enter a number: ";
size_t numberOfValuesToCheck{0};
std::cin >> numberOfValuesToCheck;
// Limit the input to meaningful values
numberOfValuesToCheck = std::clamp(numberOfValuesToCheck, MinNumberOfValuesToCheck, MaxNumberOfValuesToCheck);
// Here we will store all values
std::vector<NumberType> values(numberOfValuesToCheck);
// Read all user input and stor it in our vector
std::copy_n(std::istream_iterator<NumberType>(std::cin), numberOfValuesToCheck, values.begin());
// Calculate mean. The result is most likely a double
double meanValue {static_cast<double>(std::accumulate(values.begin(), values.end(), 0)) / static_cast<double>(values.size())};
std::cout << "\nMean value: " << meanValue << '\n';
// Look, if there is a mean value
std::vector<NumberType>::iterator found = std::find_if(values.begin(),values.end(),[&meanValue](NumberType& n){ return n == meanValue;});
if (found != values.end() ) {
std::cout << "Could erase " << *found << "New Vector:\n";
std::copy(values.begin(), values.end(), std::ostream_iterator<NumberType>(std::cout, " "));
}
else {
std::cout << "No reduction possible\n";
}
return 0;
}
Версия 2. Более «полное» решение.
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>
using NumberType = int;
constexpr size_t MinNumberOfValuesToCheck = 1;
constexpr size_t MaxNumberOfValuesToCheck = 20;
int main()
{
// Read the number of values to check
std::cout << "How many vaues shall be checked? Please enter a number: ";
size_t numberOfValuesToCheck{0};
std::cin >> numberOfValuesToCheck;
// Limit the input to meaningful values
numberOfValuesToCheck = std::clamp(numberOfValuesToCheck, MinNumberOfValuesToCheck, MaxNumberOfValuesToCheck);
// Here we will store all values
std::vector<NumberType> values(numberOfValuesToCheck);
// Read all user input and stor it in our vector
std::copy_n(std::istream_iterator<NumberType>(std::cin), numberOfValuesToCheck, values.begin());
while(numberOfValuesToCheck) {
// Calculate mean. The result is most likely a double
double meanValue {static_cast<double>(std::accumulate(values.begin(), values.end(), 0)) / static_cast<double>(values.size())};
std::cout << "\nMean value: " << meanValue << '\n';
values.erase(std::remove_if(values.begin(),values.end(),[&meanValue](NumberType& v){ return v == meanValue;}),values.end());
// Check if we coud remove a value
if (values.size() < numberOfValuesToCheck) {
// If so then the vector has less values
// Show some output:
std::cout << "Could eliminate " << numberOfValuesToCheck - values.size() << " from Vector of Values. New vector:\n";
std::copy(values.begin(), values.end(), std::ostream_iterator<NumberType>(std::cout, " "));
// New size of vector
numberOfValuesToCheck = values.size();
}
else {
// Could not reduce more
std::cout << "No further reduction possible\n";
break;
}
}
return 0;
}
Надеюсь, это поможет..