powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
25 сообщений из 29, страница 1 из 2
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32396893
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class cItem
{
  ...
};
class cItems :public std:vector<cItem*>
{
  ...
}

или так ?
Код: plaintext
1.
 std::vector<cItem*> cv;


да и еще вопрос
с вектором можно работать как с динамическим массивом ??
и как ? :)
____
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32396899
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наследовать от vector ничего не надо - это вообще бессмыслено так как там нету ни одной virtual функции :)

с вектором можно работать как с динамическим массивом ??

вот так
Код: plaintext
1.
2.
 std::vector<cItem*> cv;
 cv.insert( new cItem );
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32396903
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. вот так

Код: plaintext
1.
 std::vector<cItem*> cv;
 cv.insert( new cItem, std::vector::end() );
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32396910
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно сейчас попробую ... :)
____
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32396913
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, вторник тоже тяжелый день

надо вот так

Код: plaintext
1.
2.
3.
 cv.insert (cv.end(), new cItem );
или
 cv.push_back (new cItem);
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32396918
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
std::vector::end()

а что то он у меня на это ругается ...

я юзаю Builder C++
____
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32396928
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну теперь ужо проесняется
а если я запихал туды 5 элементов как
мне к 3-му допустим достучатся ?
____
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32396929
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя шас сам посмотрю как с этим работать дальше :)
____
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32396931
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне к 3-му допустим достучатся ?

Код: plaintext
cv[ 3 ]
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32396945
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri
наследовать от vector ничего не надо - это вообще бессмыслено так как там нету ни одной virtual функции :)

очень даже осмысленно :)

можно наследоваться, так :

class Items: protected vector<Item*> { ... }

т.е. например для переопрееления конструкторов, для замены/дополнения внешнего интерфейса и т.д.

более того, такие замены делают код более управляемым, внешний интерфейс Items можно оставить, а вот реализацию менять, как будет угодно...

напр. распространенный случай - последовательная коллекция, имеющая ф-ии быстрого поиска по ключам. Тут в классе-коллекции комбинируют и вектора и хеш-таблицы на все интересующие ключи.
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32396973
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2funikovyuri
я ужо сам догодался :))
но все равно зенькс ...

____
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32397017
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. например для переопрееления конструкторов, для замены/дополнения внешнего интерфейса и т.д.

Да нет - можно конечно только во-первых , плохо это или хорошо, - но STL была спроектирована так что наследованию там места не нашлось (об этом говорил сам Степанов).

во-вторых
Сам же отлично знаешь что protected наследование - это кандидат для агрегации (очень редки случаи его реального применения). А public реализовать мез virtual не удастся - точнее - создатели STL не хотели чтоб удалось...
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32397672
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2funikovyuri
самое интерестное что когда я ковырял исходник
какойто проги на VC
то там было иммено так

Код: plaintext
1.
2.
3.
4.
class Pitems :public vector<pItem*>
{
  ...
}


вот по этому я и спросил так лутьше или так ... :)
____
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32397803
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 funikovyuri

Отсутствие виртуальных функций класса еще ничего не говорит о том, что наследоваться от данного класса нельзя.

Главное, чтобы в коде не было удаления через указатель на предка:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
// конкретный класс
class concrete_class
{
public:
    void foo() {}
};

// улучшаем конкретный класс
class derived_from_concrete_class : public concrete_class
{
   int some_var;
public:
   
    void foo() 
    {
         concrete_class::foo();
         // улучшения
    }
};


...
concrete_class* base = new derived_from_concrete_class;
delete base; // вот здесь скажется отсутствие виртуального деструктора


Так что, наследуйтесь от чего угодно и улучшайте существующие реализации с одной лишь оговоркой - где не требуется полиморфное поведение от объекта.

Удачи.
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32397831
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 funikovyuri

И еще:) Чтобы достучаться к третьему элементу надо писать v[2], а не v[3].

Удачи.
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32397961
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков

Отсутствие виртуальных функций класса еще ничего не говорит о том, что наследоваться от данного класса нельзя.

А я разве говорил что нельзя? Вы невнимательно читали мои сообщения - пожалуйста наследуйте (через public) а потом требуйте от клиентов не использовать полиморфизм - я как раз и говорил о том что умный такого делать не станет...

Чтобы достучаться к третьему элементу надо писать v[2], а не v[3].

Да, сыр, подъеб..ли вы меня что уж тут скажешь...
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32398084
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 funikovyuri

дарю

рекомендую к использованию там, где постоянно создаются и удаляются вектора, особенно если их размер примерно одного порядка.

прибавка к быстродействию порой раз в 10 на этих специфичных местах.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
//////////////////////////////////////////////////////////////////////////
// fast-allocating array
// uses chunk pool
template<typename _Ty>
class fast_array : public std::vector<_Ty> {
	typedef std::vector<_Ty> super;
	typedef fast_array<_Ty> my_type;

	static bool destroyed;

	static struct pool_t: public std::vector<super*> {
		~pool_t() {
			for(pool_t::iterator i=this->begin(), e=this->end(); i!=e; ++i)
				delete *i;
			destroyed=true;
		}

	} pool; 

	static size_t top;

	static void get_chunk(my_type* instance) {
		size_t sz=pool.size();
		if (top>=sz)
			pool.resize(top* 2 + 50 );

		super* chunk=pool[top];
		if (chunk==NULL) 
			chunk=pool[top]=new super();	// we don't need to deallocate chunks :)

		++top;
		instance->swap(*chunk);
	}

	static void put_chunk(my_type* instance) {
		 --top;
 
		pool[top]->swap(*instance);
	}

public:
	fast_array() { get_chunk(this); resize( 0 ); }
	~fast_array() { if(!destroyed) put_chunk(this); }
};

template<class _Ty> bool fast_array<_Ty>::destroyed= 0 ;
template<class _Ty> size_t fast_array<_Ty>::top= 0 ;
template<class _Ty> typename fast_array<_Ty>::pool_t fast_array<_Ty>::pool;

//////////////////////////////////////////////////////////////////////////
typedef fast_array<char>	char_array;
typedef fast_array<int>	int_array;
typedef fast_array<size_t>	uint_array;
typedef fast_array<real>	real_array;


для типов - элементов вектора, требующих немедленного деструктора (скажем, для смарт-поинтеров объектов, владеющих "большими" ресурсами) можно добавить resize(0) при возврате в пул и убрать его из конструктора.

тут как раз примеры наследования чисто ради переопределения конструкторов и деструкторов.

есть еще причины, по которым можно отнаследоваться по public - скажем, неохота использовать смарт-поинтеры в контейнере (много причин), но AddRef() и Release() у объектов, хранящихся по указателю, делать надо... Вот и наследуемся и переопределяем деструкторы и операции добавления, ресайза и пр.
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32398159
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лови, Дим, обратно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
//////////////////////////////////////////////////////////////////////////
// fast-allocating array
// uses chunk pool
template<typename _Ty>
class fast_array
{
	typedef std::vector<_Ty> super;
	typedef fast_array<_Ty> my_type;

	super stl_vector;

	static bool destroyed;

	static struct pool_t: public std::vector<super*> {
		~pool_t() {
			for(pool_t::iterator i=this->begin(), e=this->end(); i!=e; ++i)
				delete *i;
			destroyed=true;
		}

	} pool; 

	static size_t top;

	static void get_chunk(my_type* instance) {
		size_t sz=pool.size();
		if (top>=sz)
			pool.resize(top* 2 + 50 );

		super* chunk=pool[top];
		if (chunk==NULL) 
			chunk=pool[top]=new super();	// we don't need to deallocate chunks :)

		++top;
		instance->stl_vector.swap(*chunk);
	}

	static void put_chunk(my_type* instance) {
		 --top;
 
		pool[top]->swap(instance->stl_vector);
	}

public:
	fast_array() { get_chunk(this); stl_vector.resize( 0 ); }
	~fast_array() { if(!destroyed) put_chunk(this); }
};

template<class _Ty> bool fast_array<_Ty>::destroyed= 0 ;
template<class _Ty> size_t fast_array<_Ty>::top= 0 ;
template<class _Ty> typename fast_array<_Ty>::pool_t fast_array<_Ty>::pool;

//////////////////////////////////////////////////////////////////////////

typedef fast_array<char>	char_array;
typedef fast_array<int>	int_array;
typedef fast_array<size_t>	uint_array;
typedef fast_array<real>	real_array;


Я заменил protected наследование агрегацией
А public наследование внутри класса менять не стал по 2м причинам
- лень
- это локальный класс и область его применения очень узка - так что можно гарантировать его правильное применение самостоятельно - но опять же ничего хорошего в этом нет
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32398431
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщето-то там было именно public наследование, т.е. инстанс класса ведет себя именно как обычный STL-вектор, а то, что ты прислал - класс без единого полезного метода. (при желании можно переопределить все сигнатуры конструкторов вектора)

Внутренний класс тоже именно STL вектор, и именно в этом качестве он и используется. Зачем наследование? да ради только деструктора .

И такие вещи я делаю сплошь и рядом - экономлю время, вовсю пользуя STL.

Наследование еще никто не отменял, даже если в цепочке наследования нет фиртуальных ф-ий. Согласно правилам гомоморфных иерархий, с наследованием при наличии виртуальных ф-ий надо быть осторожнее, ибо чистая гомоморфная иерархия предполагает, что к базовому набору виртуальных ф-ий не добавляются никакие другие виртуальные ф-ии в процессе наследования. Однако наследование зачастую используется не только с целью использовать полиморфизм и строить эти чистые гомоморфные иерархии, зачастую мы используем наследование для тривиальной декомпозиции (с целью повторного использования кода).
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32398500
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий
Вообщето-то там было именно public наследование,
Ты вообще мои сообщения читаешь? Там public наследование как раз осталось - я избавился только от protected

а то, что ты прислал - класс без единого полезного метода.

То что я прислал - это 100% рабочий эквивалент того что прислал ты - но без protected-наследования... Я опять же сомневаюсь что ты внимательно прочитал мой ответ

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

Ты хоть сам-то пытался понять что написал? Полная каша из терминов с выходной полезной составляюще стремящейся к 0 - такой фигней пугать можно разве что ежиков в лесу :)
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32398506
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так - я все перепутал - у тебя в обоих случаях public-наследование...

Только вот теперь мне вообще не ясно - что ты своим кодом пытался показать (я думал ты демонстрируешь применение protected-inheritance) - да можно наследовать для того чтобы добавлять - но не изменять - так как иначе нарушится полиморфизм...
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32398591
Доброжелатель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух, понаписли-то сколько :)

2 vdimas
Наследование еще никто не отменял, даже если в цепочке наследования нет фиртуальных ф-ий. Согласно правилам гомоморфных иерархий, с наследованием при наличии виртуальных ф-ий надо быть осторожнее, ибо чистая гомоморфная иерархия предполагает, что к базовому набору виртуальных ф-ий не добавляются никакие другие виртуальные ф-ии в процессе наследования. Однако наследование зачастую используется не только с целью использовать полиморфизм и строить эти чистые гомоморфные иерархии, зачастую мы используем наследование для тривиальной декомпозиции (с целью повторного использования кода).

А с "нечистой" гомоморфной иерархией какие проблемы могут возникнуть?
Если ты про "бриллиантовое" наследование, то в этом случае стандартом оговорены правила доминирования.

2 funikovyuri
ндя, видно у тебя день не задался ;)
Дался тебе этот полиморфизм.

PS Кстати, сейчас рулит статический полиморфизм.
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32398594
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброжелатель

Дался тебе этот полиморфизм.

Это не я - это они первые начали...

PS Кстати, сейчас рулит статический полиморфизм.

В смысле overloading - так он та тут при чем?
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32398714
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 funikovyuri
Вообще-то я дал пример полезного класса - наследника вектора. Этот класс весьма применим в случаях частого создания и удаления векторов. Используй и наслаждайся.

Как видишь, он образован путем public-наследования, и переопределяет только конструктор и деструктор с целью использования пула векторов (вернее - пула "тел" векторов, используя замечательную STL парадигму - swap).

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

2 Доброжелатель
А с "нечистой" гомоморфной иерархией какие проблемы могут возникнуть?
Проблема "каши". Проблема попыток узнать в методах базового класса тип актуального наследника и пр. прелести.
...
Рейтинг: 0 / 0
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
    #32400091
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Доброжелатель

PS Кстати, сейчас рулит статический полиморфизм

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


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