powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как упорядочить данние в динамическом масиве
29 сообщений из 29, показаны все 2 страниц
Как упорядочить данние в динамическом масиве
    #32315254
DimBV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть динамический массив, с одинаковыми некоторыми значениями которые нужно выкинуть, а остальные упорядочить по возростанию.
Кто может или знает помогите.
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315283
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
массив - это объект какого класса?
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315291
DimBV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите как это можно осуществить.
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315293
DimBV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну просто масив значений
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315359
123456789098
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как вариант можно упорядочить, а потом путем сравнения соседних элементов выкинуть одинаковые. Наверняка это не оптимальный метод и есть нечто более быстрое. загляни сюда http://algolist.manual.ru/ . Наврняка найдешь неплохое решение
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315414
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пользуйся STL всегда и везде.

map<тип значения, твой класс> lst;

for(int i = 0; i < 100; i++)
lst[val ] = objs;


map<тип значения, твой класс>::iterator i_ptr= lst.begin();

for(; i_ptr!= lst.end(); i_ptr++)
{
тип значения val = (*i_ptr).first;
твой класс obj = (*i_ptr).second;

}
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315425
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
угу, STL все сделает

Код: plaintext
1.
2.
3.
4.
5.
vector<тип> v; // твой вектор
set<тип> s; // промежуточный уникальный set

copy(v.begin(), v.end(), insert_iterator(s));
v.swap(vector<тип>);
copy(s.begin(), s.end(), back_insert_iterator(v));
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315455
123456789098
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
согласен на все 200% stl это то что нужно
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315468
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, STL, только использовать set и map для данной задачи это все равно, что стрелять из пушки по воробьям. В самом деле:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    std::sort(array, array + sizeof(array)/sizeof(array[ 0 ]));
    std::copy(
        array, 
        std::unique(array, array + sizeof(array)/sizeof(array[ 0 ])),
        std::ostream_iterator<int>(std::cout,  " | " )
    );
}


Удачи.
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315470
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка:

Код: plaintext
    int array[] = { 34 ,  23 ,  34 ,  12 ,  56 ,  23 ,  23 };
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315472
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vdimas

Конструкция вида v.swap(vector<тип>()) не верна, поскольку swap принимает в качестве параметра lvalue (vector &), тогда как vector<int>() - rvalue. Код по очистке вектора должен выглядеть следующим образом:

Код: plaintext
vector<тип>().swap(v);


Удачи.
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315493
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков писал:Конструкция вида v.swap(vector<тип>()) не верна, поскольку swap принимает в качестве параметра lvalue (vector &), тогда как vector<int>() - rvalue. Код по очистке вектора должен выглядеть следующим образом:

торопыжка
1. v.swap(vector<тип>()) - эта конструкция инвариантна, т.е. vector<тип>().swap(v); - тоже самое.
2. В lvalue допустимы временные объекты, и я это сплошь и рядом использую в алгоритмах, а так как в любом случае для swap приходится использовать временный объект, то мне фиолетово, с какой стороны его поместить. Спорить не надо, твое заявление меня настолько поразило (ну мало ли, вдруг я действительно ошибся), что я тут же накатал это все, скомпилил и проверил - все гут. :)
3. Ты решил задачу, не посмотрев условие. Прочти еще раз условие и ответь - для чего я взял std::set ??? (кстати, непонятно, зачем Lepsik взял std::map)
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315494
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, создай массив на 1000000 элементов и проверь быстродействие своего и моего варианта. Будешь удивлен, особенно, если возьмешь STL от boost. :)
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315795
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 vdimas
Очевидно, Lepsik взял map, чтобы эквивалентные значения объектов выкидывались, а не эквивалентные упорядочивались по возрастанию на этапе вставки. Помимо некоторого "извращения" этот подход содержит потенциальный подвох. Равенство по a == b и эквивалентность, понимаемая в map как !(a < b) && !(b < a) в ряде случаев не одно и то же, хотя для чисел все будет ок.
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32315942
vdimas писал:
...
v.swap(vector<тип>);
...


Интересно, а зачем нужно делать этот swap ? В чем фишка?

Кстати, и не совсем понятно на счет "insert_iterator(s)" - например у меня такая конструкция не работает (STL от VC7.1).

Несколько подработанный вариант :)
Код: plaintext
1.
2.
3.
4.
5.
6.
	int a[ 10 ] = { 5 ,  7 ,  1 ,  3 ,  1 ,  8 ,  7 ,  2 ,  8 ,  9 };
	std::vector<int> v(a, a+ 10 );
	std::set<int> s;
	std::copy(v.begin(), v.end(), std::inserter(s, s.begin()));
	v.resize(s.size());
	std::copy(s.begin(), s.end(), v.begin());
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32316026
DimBV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое всем спасибо щас буду пробывать
только одного непонял что такое STL ?
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32316449
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vdimas

>1. v.swap(vector<тип>()) - эта конструкция инвариантна, т.е. vector<тип>().swap(v); - тоже самое.

То что это пропускает ваш компилятор не означает, что эта конструкция верна. Ваше утверждение ложно и никакой это не инвариант. Читайте стандарт, в частности 3.10.

>2. В lvalue допустимы временные объекты, и я это сплошь и рядом использую в алгоритмах, а так как в любом случае для swap приходится использовать временный объект, то мне фиолетово, с какой стороны его поместить. Спорить не надо, твое заявление меня настолько поразило (ну мало ли, вдруг я действительно ошибся), что я тут же накатал это все, скомпилил и проверил - все гут. :)

Ваша бравада закончится, как только вы перейдете на компилятор соответствующий в этом плане стандарту:

Код: plaintext
1.
2.
3.
4.
5.
6.
#include <vector>

int main()
{
    std::vector<int> v;
    v.swap(std::vector<int>());
}



Your Comeau C/C++ test results are as follows:

Comeau C/C++ 4.3.3 (Aug 6 2003 15:13:37) for ONLINE_EVALUATION_BETA1
Copyright 1988-2003 Comeau Computing. All rights reserved.
MODE:strict errors C++

"ComeauTest.c", line 6: error: initial value of reference to non-const must be an
lvalue
v.swap(std::vector<int>());
^

1 error detected in the compilation of "ComeauTest.c".


>3. Ты решил задачу, не посмотрев условие. Прочти еще раз условие и ответь - для чего я взял std::set ??? (кстати, непонятно, зачем Lepsik взял std::map)

Если честно, то хрен его знает зачем вы использовали set, хотя условие прочел неоднократно.

Удачи.
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32316625
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst писал:Очевидно, Lepsik взял map, чтобы эквивалентные значения объектов выкидывались, а не эквивалентные упорядочивались по возрастанию на этапе вставки. Помимо некоторого "извращения" этот подход содержит потенциальный подвох. Равенство по a == b и эквивалентность, понимаемая в map как !(a < b) && !(b < a) в ряде случаев не одно и то же, хотя для чисел все будет ок.
все ясно, но map - это map, я использую set именно для того, что ты описал.
а насчет эквивалентности, то для описанной задачи: сортировка (<) и выкинуть лишнее (==) выполнение этих условий подразумевается.

2 Анатолий Широков
наверно ты прав, насчет, lvalue.
мой компилятор позволяет такие фокусы для агрегированных типов (классы, структуры).

насчет твоего способа, вот почему я не взял unique:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
template<class _FwdIt> inline
	_FwdIt unique(_FwdIt _First, _FwdIt _Last)
	{	// remove each matching previous
	for (_FwdIt _Firstb; (_Firstb = _First) != _Last && ++_First != _Last; )
		if (*_Firstb == *_First)
			{	// copy down
			for (; ++_First != _Last; )
				if (!(*_Firstb == *_First))
					*++_Firstb = *_First;
			return (++_Firstb);
			}
	return (_Last);
	}


двойной вложенный проход по всему массиву, очевидно, что время работы unique пропорционально квадрату количества элементов массива, что не есть гут, в то время как set использует деревца, и одновременно и сортирует и выкидывает повторы. По количеству операций set приближается к quicksort. Да, в set мы имеем операции с памятью (весьма небыстрые), что тоже не есть гут. Однако, если подобную задачу выполнять постоянно с одним и тем же экземпляром set, и использовать какой-нить вменяемый аллокатор, то выделение памяти произойдет (в большинстве случаев) одноразово, а все остальные разы set сработает быстро, "одним махом" и отсортировав и выкинув лишнее.

2 Андрей Шевченко

Интересно, а зачем нужно делать этот swap ? В чем фишка?
Это стандартный способ очистки контейнеров - swap с пустым, эти контейнеры меняются хранимыми объектами в памяти, над которыми производят операции.

Применил не подумав, т.к. заставил выделять память заново, твой способ с resize лучше.

Кстати, и не совсем понятно на счет "insert_iterator(s)" - например у меня такая конструкция не работает (STL от VC7.1).
Код: plaintext
1.
2.
3.
4.
5.
template<class _Container,
	class _Iter> inline
	insert_iterator<_Container> inserter(_Container& _Cont, _Iter _Where)
	{	// return insert_iterator
	return (std::insert_iterator<_Container>(_Cont, _Where));
	}


не факт, что компилятор не создаст лишний временный объект при компилировании return этой ф-ции, поэтому юзаю непосредственно insert_iterator. Просто я там описался (причем дважды), строчил быстро навскидку прямо в форум :), описки, разумеется можно было и исправить, тогда все заработало бы.
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32316674
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimBV --только одного непонял что такое STL ?

Это то что ты должен знать как "Отче наш" если хочешь быть профи С++ программистом.

Формально это библиотека - набор темплейтов - классов контейнеров.

Любой приличный компилятор имеет STL в своем составе.

vector - работает быстро, но не сортирует зато удобно работать как с обычным массивом.

vector<int> a; vector<double> b; vector<любой класс> с;


for(int i = 0; i < 100; i++)
{ a.push_back(i); b.push_back( a ); }

deque<> - работает как вектор, но чуть медленне, зато позволяет делать вставки в середину


set<> автоматом сортирует, но пряимой доступ к элементам в векторе отсутствует.

map<type1, type2> массив, где первый тип = индекс.

писать можно до бесконечности - просто открой хелп и смотри.

STL - это та мощь, без которые которой все остальные языки просто классом ниже стали

а еще круче STL + XML. Код становится проще и уменьшается в размерах.

На контрольном проекте стал меньше вдвое.
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32316768
Фотография osse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Lepsik
"а еще круче STL + XML. Код становится проще и уменьшается в размерах."
А что такое STL + XML ?
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32316777
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, если можно подробнее, на чем именно произошла экономия вдвое?
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32317125
DimBV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
int a[10] = {5, 7, 1, 3, 1, 8, 7, 2, 8, 9};
std::vector<int> v(a, a+10);
std::set<int> s;
std::copy(v.begin(), v.end(), std::inserter(s, s.begin()));
v.resize(s.size());
std::copy(s.begin(), s.end(), v.begin());

Это круто работает но есть одна проблемка он работает для статического масива, а не для динамического ЧТО ДЕЛАТЬ??
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32317174
DimBV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой извините загнался :-))
std::sort(SS, SS + sizeof(SS)/sizeof(SS[0]));
std::copy(
SS,
std::unique(SS, SS + sizeof(SS)/sizeof(SS[0])),
std::ostream_iterator<double>(std::cout, " | ") );
для статического , а для динамического?
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32317276
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясни тогда, что ты подразумеваешь под словом "динамический" ? желательно с примером
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32317309
DimBV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Типа такого
DynamicArray<double> S;

и в цыкле задается размер и он заполняется
........
S.Length += 1;
S[n] = b.dr;
n = n++;
........
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32317593
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2vdimas

---да, если можно подробнее, на чем именно произошла экономия вдвое?

сильно упростился код. собственно произошел переход в ряде мест от обьектно-ориентированного программирования обратно к линейному за счет переноса части обьектов в в их отображения в XML. Это конечно зависит сильно от характера задач. Особенно заметно на задач, связанных с клиент-серверной технологией.

например структура базы у меня хранится в XML, она же используется для создания базы, проверки целостности. По классической методике UML я должен иметь класс для каждой таблицы, соотсветсвенно методы чтения и записи, а также если есть форма работы с через форму - то еще и методы записи-чтение форма/класс

В новой идеалогии мне не надо иметь такое кoличество классов (только для тяжелых случаев) - у меня есть несколько универсальных несложных методов, знающих что нужно делать и автоматизирующих 90% операций такого рода.


2osse
--А что такое STL + XML ?

код в большинстве своем базирован на операциях с STL и использует XML в качестве : настроек программы, логики, схематики, локализации, поддержки мультиязычности и т.д. и т.п..

2DimBV

если тебе нужно скопировать один STL обьект в другой, то используй '='

vector<int> a, b;
a.push_back(1);
b = a;

но если у тебя используется домарощенный обьект, то нужнов ряде случаев иметь копи конструктор
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32317702
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Lepsik

В одном из недавних проектов делали аналогично, только без XML.
Хранили в базе метаданные, описывающие все и вся. Этих описательных структур-то всего около 3-х десятков, так что обошлись без тяжеловесного XML. :)
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32318016
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой же он тяжеловесный ?

если структура простая - то простой.
...
Рейтинг: 0 / 0
Как упорядочить данние в динамическом масиве
    #32318641
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Lepsik

А какой парсер XML использовал?
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как упорядочить данние в динамическом масиве
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]