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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2010, 20:54   #1
Stepan575
Пользователь
 
Регистрация: 25.11.2010
Сообщений: 18
По умолчанию Ошибка с классом vector

Вобщем вполне стандарная задача состоит в том чтобы из массива удалить повторяющиеся элементы (int) просто через массивы сделать то я могу, но сейчас как раз разбираюсь с классом vector и не понимаю почему не работает((
Ошибка где-то в третьем for вылетает, на инкременте j вроде...вопрос почему?
Код:
#include "stdafx.h"
#include <vector>
#include "iostream"
using namespace std;

int main()
{
	vector<int> test; 	
	vector<int>::iterator i,j;

	int buf [] = { 1, 1 ,2 ,2 ,2 ,1,4 ,4 ,4 ,1,1 ,1 ,3 , 4  ,1};
	for(int k=0;k<15;k++)
	    {
	       test.push_back(buf[k]);
	    }

           for (i = test.begin(); i != test.end(); i++)			
			    for (j=i; j!= test.end(); j++)
			           if(*j==*i)	test.erase(j);
		   	   
		  
	for (i = test.begin(); i != test.end(); i++)
		   cout<<*i<<" ";
	getchar();
}

Последний раз редактировалось Stilet; 26.11.2010 в 16:01.
Stepan575 вне форума Ответить с цитированием
Старый 25.11.2010, 22:31   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Код:
#include <algorithm>
#include <iostream>
#include <vector> 

int main()
{
	int arr[] = {1, 1, 1, 2, 1, 2, 2, 1, 3, 3, 1, 2, 1, 3, 1};
	std::vector<int> v(arr, arr + sizeof(arr)/sizeof(int));

	std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
	std::cout << std::endl;

	std::sort(v.begin(), v.end());
	v.erase(std::unique(v.begin(), v.end()),  v.end());

	std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));

	return 0;
}
http://codepad.org/tO2uZ3YY
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 26.11.2010, 02:57   #3
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от Stepan575 Посмотреть сообщение
но сейчас как раз разбираюсь с классом vector и не понимаю почему не работает((
Вам бы сейчас не вектор изучать, а подтянуть как минимум управление памятью , перегрузку операторов и базовые структуры данных... После того, как основы С++ будете знать неплохо, уже стоит чуть познакомиться с STL по Амераалю или Джосьютису, а уж потом углубленные знания STL почерпнуть из книг Майерса и Саттера.
Просто мне трудно представить, как этот код можно написать еще хуже.
still_alive вне форума Ответить с цитированием
Старый 26.11.2010, 10:57   #4
Stepan575
Пользователь
 
Регистрация: 25.11.2010
Сообщений: 18
По умолчанию

to ISergeyN спасибо конечно, но поиском я пользоваться умею, мне просто интересно почему не работает именно мой код..
to still_alive я конечно с уважением отношусь к людям знающим своё дело, но поставлен конкретный вопрос почему ругается на j++; Как мне изучить STL я вроде бы не писал..
Stepan575 вне форума Ответить с цитированием
Старый 26.11.2010, 13:16   #5
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

1)
for (j=i; ...
if(*j==*i) test.erase(j); - поздравляю, вы удаляете весь массив)

2) erase удаляет элемент, сдвигая остальные на одну позицию влево. Вы уверены, что для того, чтобы получить итератор на следующий элемент, нужно увеличить j?)

3) после erase(j) итератор j становится недействительным.

Цикл с необходимыми изменениями:
Код:
for (i = test.begin(); i != test.end(); i++) 
for (j=i+1; j!= test.end(); )
if(*j==*i) j = test.erase(j); else ++j;
still_alive вне форума Ответить с цитированием
Старый 26.11.2010, 14:06   #6
Stepan575
Пользователь
 
Регистрация: 25.11.2010
Сообщений: 18
По умолчанию

Первое то я вчера ещё заметил
Вот за j = test.erase(j); спасибо большое
как я понимаю erase(j) удаляя j возвращает итератор на следующий элемент, так?
Stepan575 вне форума Ответить с цитированием
Старый 26.11.2010, 14:13   #7
Stepan575
Пользователь
 
Регистрация: 25.11.2010
Сообщений: 18
По умолчанию

Всё нашёл, так и есть..
Порывшись в закромах нашёл книгу по STL Джосьютис))
Stepan575 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с классом _-Re@l-_ Общие вопросы C/C++ 3 23.09.2010 19:15
Работа с классом UnChanter Помощь студентам 2 14.03.2010 20:23
Работа с классом| C++ Konicy Общие вопросы C/C++ 15 21.12.2009 19:08
Программа с классом и объектами. wepoTWR Помощь студентам 3 10.11.2009 22:34
C++ работа с классом VadEr Помощь студентам 2 17.05.2009 12:33