Как в цикле удалить минимальный элемент вектора?

#include<iostream>
#include<ctime>
#include<fstream>
#include<vector>
#include<iterator>
#include<algorithm>
using namespace std;


pr_vec(vector<int>A)
{
	for(int i=0; i<A.size(); i++)
	cout<<A[i]<<' ';
	cout<<endl;
	}
	///////////////////////////////////////////////////////////////////////
int main(){
	setlocale(LC_ALL, "russian");
	
int x, min;

ifstream A("a.txt");									// читаем файл а.
if(!A)
{
cout<<"Error"<<endl;									// проверяем на открытие(ошибку)
return 1;
}

while(!A.eof())											// читаем файл до последней строчки
{
A>>x;
// cout<<x<<endl;
}
A.close();

A.open("a.txt");										//снова открываем файл чтобы с ним работать
if(!A)
{
cout<<"Error"<<endl;
return 1;
}

ofstream B("b.txt");									// открываем(создаем) новый файл на запись
if(!B)
{
cout<<"Error"<<endl;
return 1;
}
A>>min;

while(!A.eof())
{

A>>x;
if ((x%2==0)&&(x<min) )min=x;
//cout<<min<<endl;
}
cout<<"В файл 'b' было записано минимальное значение предложенных чисел"<<endl<<endl;
B<<min<<endl;

A.close();
B.close();

A.open("a.txt");										//снова открываем файл чтобы с ним работать
if(!A)
{
cout<<"Error"<<endl;
return 1;
}
//////////////////////////////////////////////////////////////////////////////////////////

int n;
vector<int>MyVector;
vector<int>::iterator it;//создаем итератор
ifstream C("a.txt");
while(!C.eof())
{
	C>>n;
	MyVector.push_back(n);
//	cout<<n<<endl;
}
C.close();

////////////начинаем обработку////////////////////////////////
for(int t=1; t!=11; t++){

int sum=0;
for(int i=0; i<MyVector.size();i++)
{
	sum=sum+MyVector[i];
}
//cout<<"Суммарное значение вектора: "<<sum<<endl;
MyVector.insert(MyVector.begin(),sum);

int min1;//не хочет циклично удалять минимум
for (int i=0; i< MyVector.size(); i++)
{
	if(MyVector[i]<min1)
	min1=MyVector[i];
}
MyVector.erase(remove(MyVector.begin(), MyVector.end(), min1), MyVector.end());

cout<<"Минимальное значение вектора: "<<min1<<endl;
cout<<"Проход: "<<t<<endl;
pr_vec(MyVector);
}


ofstream Q("c.txt");									// открываем(создаем) новый файл на запись
if(!Q)
{
cout<<"Error"<<endl;
return 1;
}
for(int i=0; i<MyVector.size(); i++)
Q<<MyVector[i]<<endl;
Q.close();
cout<<endl;
cout<<"В файл 'c' был записан итоговый вектор с десятью проходами по подсчету суммы и удалению минимума"<<endl;


system ("pause");
return 0;
}


Вот весь мой код.
у меня есть файл а, где через enter 12 действительных чисел. от туда я нахожу четное минимальное число и пишу его в файл b. тут все ок. дальше я должна создать вектор из чисел файла а(ок) посчитать сумму(ок), поставить ее пере всем вектором(ок) найти минимум(ок) и удалить его(ок). только вот эту операцию в суммой и минимумом надо повторить 10 раз и если сумма спокойно проходит, но минимум он один раз нашел, удалил и успокоился, а мне надо это делать в каждом проходе. я не понимаю в чем проблема. возможно надо использовать итератор, которые мы сейчас проходим, но там я могу удалять только по типу

vector<int>MyVector;
vector<int>::iterator it;
//блабла вектор
it=MyVector.begin()+1;
MyVector.erase(it);


но тут можно удалить первое значение...второе...последнее. а мне нужно удалить min1 причем 10 раз!
помогите, пожалуйста
  • Вопрос задан
  • 376 просмотров
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
Из описания

#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
#include<fstream>
#include<numeric>
using namespace std;

int get_min_even(const vector<int>& numbers)
{
  vector<int> result;
  copy_if(numbers.cbegin(), numbers.cend(), 
          back_inserter(result), [](const int i){ return !(i % 2); });
  return *min_element(result.cbegin(), result.cend());
}

int main()
{
  vector<int> numbers;

  ios_base::sync_with_stdio(false);

  if(ifstream in("D:\\numbers_in.txt"); in)
  {
    copy(istream_iterator<int>{in}, {}, back_inserter(numbers));
  }

  if(ofstream out("D:\\numbers_out.txt"); out)
  {
    out << get_min_even(numbers);
  }

  int count = numbers.size() - 2; // предположим 10
  
  for(int i = 0; i < count; ++i)
  {
    // вставка в начало вектора это BAD.
    numbers.push_back(accumulate(numbers.cbegin(), numbers.cend(), 0)); 
    numbers.erase(remove(numbers.begin(), numbers.end(), *min_element(numbers.begin(), numbers.end())));
  }

  // Это потому что вставляли в конец, теперь нужно перевернуть.
  reverse(numbers.begin(), numbers.end()); 
  // маленький костыль
  swap(numbers[count], numbers[count + 1]); 

  if(ofstream out("D:\\numbers_result_out.txt"); out)
  {
    copy(numbers.cbegin(), numbers.cend(), ostream_iterator<int>{out, "\n"});
  }
 
  cout << "Ok" << endl;
  cin.get();
}

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы