Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2009, 20:20   #1
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию Работа со списками методами STL

Доброе время суток...)) у меня не большая загвоздка получилась...мне нужно удалить все отрицательные элементы из списка...(это часть задания, остальное я знаю)...использовал функцию erase...я так понял, что она в цикле не работает...(выбивало ошибку на этапе тестирования)...я указал в параметрах erase начало списка и сколько последних его элементов не нужно удалять...и здесь возникает ошибка...кто знает, помогите, пожалуйста...а то и лабу сдавать - и самому интересно...))) Заранее большое спасибо...)))

Код:
#include <iostream>
#include <list>
#include <conio.h>
#include <cstdlib>
#include <iomanip>
#include <iterator>

using namespace std;
typedef list<int> CList;

void main ()
{
	setlocale(0,"");
	CList clist, clist2;
	int n;
	cout<<"Введите количество элементов в списке\n";
	cin>>n;
	for (int i=0; i<n; i++){
		clist.push_back(rand()%+20-7);// заполнение списка
	}
	cout<<"Исходный список:\n";
	CList::iterator iter=clist.begin();// указатель на начало списка
	while (iter!=clist.end())// вывод списка на экран
	{
		cout<<setw(5)<<*iter;
		iter++;
	}
	cout<<endl<<endl;
	clist.sort();// сортировка списка
	cout<<"Отсортированный список:\n";
	iter=clist.begin();
	while (iter!=clist.end())// вывод отсортированного спика на экран
	{
		cout<<setw(5)<<*iter;
		iter++;
	}
	cout<<endl<<endl;
    
	CList::iterator iter2=clist2.begin();//копирование отрицательных
	iter=clist.begin();
	for (; iter!=clist.end(); *iter++){
		clist2.push_back(*iter);
	}
	clist2.sort();

	iter=clist.begin();
	int k=0;
	while (iter!=clist.end())
	{
		    if (*iter<0)
				k++;		
	}
	iter=clist.begin();
	clist.erase(clist.begin(), clist.end()--(n-k));

	iter=clist.begin();
	iter2=clist2.begin();
	for (; iter2!=clist2.end(); *iter2++){
		if (*iter2<0)
		clist.push_front(*iter2);
	}

	cout<<"По заданию А:\n";
	iter=clist.begin();
	while (iter!=clist.end()){
		cout<<setw(5)<<*iter;
		iter++;
	}

	getch();
}
JeyKip вне форума Ответить с цитированием
Старый 16.12.2009, 20:29   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Читаем
Код:
for(CList::iterator it = clist.begin(); it != clist.end(); ++it)
    if(*it < 0)
        it = clist.erase(it);
netrino вне форума Ответить с цитированием
Старый 16.12.2009, 20:46   #3
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию Лишние элементы

Спасибо..)))) Ты не знаешь, откуда берутся лишние элементы...?..)))
JeyKip вне форума Ответить с цитированием
Старый 16.12.2009, 21:13   #4
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию Сам себя исправляю

Разобрался...))

В коде:
Код:
for(CList::iterator it = clist.begin(); it != clist.end(); ++it)
    if(*it < 0)
        it = clist.erase(it);
вместо if нужен while:
Код:
for(CList::iterator it = clist.begin(); it != clist.end(); ++it)
    while (*it < 0)
        it = clist.erase(it);
JeyKip вне форума Ответить с цитированием
Старый 16.12.2009, 21:16   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Даже не вместо if,а вместо for) не учёл я этот момент, пардон)
Код:
	iter = clist.begin();
	while(iter != clist.end()) {
		if(*iter < 0)
			iter = clist.erase(iter);
		else
			++iter;
	}
Ну или раз список отсортированный, то:
Код:
	iter = clist.begin();
	while(*iter < 0)
		iter = clist.erase(iter);
netrino вне форума Ответить с цитированием
Старый 17.12.2009, 02:13   #6
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

std::remove_if
Код:
#include <functional>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <locale>
#include <list>

int RandomNumber () { return (rand()%15 - 7); }

int main(){

	std::locale::global(std::locale("Russian"));
	std::list<int> list(10);
	std::generate(list.begin(), list.end(), RandomNumber);

	std::cout << "Исходный список:\n";
	std::copy(list.begin(), list.end(), std::ostream_iterator<int>(std::cout, " "));

	std::list<int>::iterator end;

	end = std::remove_if(list.begin(), list.end(), std::bind2nd(std::less<int>(), 0));
	list.erase(end,list.end());

	std::cout << "\nСписок без отрицательных елементов:\n";
	std::copy(list.begin(), list.end(), std::ostream_iterator<int>(std::cout, " "));

	return 0;
}
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....

Последний раз редактировалось ISergeyN; 17.12.2009 в 02:16.
ISergeyN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c++. Работа со списками megavolt91 Помощь студентам 0 14.06.2009 21:31
Работа со строками и методами в Java PavelZet Помощь студентам 1 02.06.2009 05:36
Работа со списками Dimo444ka Помощь студентам 2 01.06.2008 16:34
Работа со списками. radist Паскаль, Turbo Pascal, PascalABC.NET 4 07.05.2007 00:05