powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Различные структуры данных. Реализация
422 сообщений из 422, показаны все 17 страниц
Различные структуры данных. Реализация
    #38858015
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Сегодня проектировал стек LIFO, вот что получилось

stack.h

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <stdio.h>
#include <stdlib.h>

#define SEMPTY -1

struct Stack
{
	size_t max_size;
	size_t cur;//позиция для записи следующего элемента
	int (*push)(int el, struct Stack*);
	int (*pop)(struct Stack*);
	int* buffer;
};

struct Stack* createStack(size_t maxsize);




stack.c

Код: 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.
#include "stack.h"

int push(int el, struct Stack* s)
{
	if (s->cur == s->max_size)
	{
		printf("stack is full.\n");
		return -1;
	}
	else
	{
		s->buffer[s->cur++] = s->cur;
		return 0;
	}
}

int pop(struct Stack* s)
{
	if (s->cur == 0)
	{
		printf("stack is empty.\n");
		return SEMPTY;
	}
	else
	{
		return *(s->buffer + --s->cur);
	}
}

struct Stack* createStack(size_t maxsize)
{
	struct Stack* s = (struct Stack*)malloc(sizeof(struct Stack));
	s->max_size = maxsize;
	s->cur = 0;
	s->push = push( );
	s->pop = pop(s);
        s->buffer = NULL;
	s->buffer = (int*)malloc(sizeof(int)*s->max_size);
	return s;
}



Подскажите пожалуйста, как правильно реализовать функцию createStack() ? Мне не нравится использование SEMPTY, но пока не придумал как от этого избавиться. Как бы вы поступили ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858211
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне не нравится использование SEMPTY, но пока не придумал как от этого избавиться. Как бы вы поступили ?
Код: plaintext
1.
bool pop(struct Stack* s, int* result)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858261
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще лучше кидать исключение, но их нет в С.

Можно их имитировать через setjump/longjump.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858381
Аноним123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Считаю, что C-style стек должен выглядеть как-то так:

stack.h
Код: 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.
#ifndef STACK_H
#define STACK_H

#include <stddef.h> // size_t

struct Stack;

/**
 * @brief StackCreate - создает новый стек
 * @param max_size - максимально возможное число элементов в стеке
 * @return указатель на созданный стек или NULL, в слечае неудачи
 */
struct Stack* StackCreate(size_t max_size);

/**
 * @brief StackPush - добавляет новый элемент в стек
 * @param s - валидный указатель на стек
 * @param val - новый элемент
 * @return число вставленных элементов
 */
int StackPush(struct Stack* s, int val);

/**
 * @brief StackPop - извлекает элемент из стека
 * @param s - валидный указатель на стек
 * @param result - результат
 * @return число извлеченных элементов
 */
int StackPop(struct Stack* s, int* result);

#endif




stack.c
Код: 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.
#include "stack.h"

#include <assert.h>
#include <stdlib.h> // malloc

struct Stack
    {
    size_t max_size;
    size_t cur_size;
    int* buffer;
    };

struct Stack* StackCreate(size_t max_size)
    {
    struct Stack* s = (struct Stack*)malloc(sizeof(struct Stack));
    if (s != NULL)
        {
        s->max_size = max_size;
        s->cur_size = 0;
        s->buffer = (int*)malloc(sizeof(int) * max_size);
        if (s->buffer == NULL)
            {
            free(s);
            s = NULL;
            }
        }
    return s;
    }

int StackPush(struct Stack* s, int val)
    {
    assert(s != NULL);
    if (s->cur_size == s->max_size)
        {
        return 0;
        }
    s->buffer[s->cur_size] = val;
    ++s->cur_size;
    return 1;
    }

int StackPop(struct Stack* s, int* result)
    {
    assert(s != NULL);
    if (s->cur_size == 0)
        {
        return 0;
        }
    --s->cur_size;
    *result = s->buffer[s->cur_size];
    return 1;
    }
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858400
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСегодня проектировал стек LIFO, вот что получилось
Если ты идёшь по пути чистого С, то один malloc лишний: гораздо удобнее работать со
структурой переменного размера, поскольку память не фрагментируется. Указывать
максимальный размер стека при создании, возможно, соответствует техзаданию, но тоже
абсолютно излишне.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858414
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аноним123,
хочу реализовать стек как один объект
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858426
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSashaMercuryСегодня проектировал стек LIFO, вот что получилось
Если ты идёшь по пути чистого С, то один malloc лишний: гораздо удобнее работать со
структурой переменного размера, поскольку память не фрагментируется. Указывать
максимальный размер стека при создании, возможно, соответствует техзаданию, но тоже
абсолютно излишне.


Вы предлагаете реаллоцировать при добавлении элемента? Если я вас правильно понял, то думаю что это спорный момент. Реаллоцирование тратит много времени. Максимальный размер стека необходим для безопасной работы программы
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858438
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВы предлагаете реаллоцировать при добавлении элемента?
Нет, я предлагаю использовать связанный список буферов. Возможно, заранее
предопределённого размера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858496
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас коллеги мы дойдем до формулы расчёта

Код: plaintext
1.
2.
INITIAL_EXTENT=
NEXT_EXTENT=
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858542
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSashaMercuryВы предлагаете реаллоцировать при добавлении элемента?
Нет, я предлагаю использовать связанный список буферов. Возможно, заранее
предопределённого размера.


Связанный список и надо использовать. Т.е. что значит -- надо ? Обычно так делают.

SashaMercury, у тебя это даже не совсем стек. Т.е. стек, но на базе массива.
А обычно делают стек на базе связного/двусвязного списка.
Хотя, конечно, и такой стек имеет право на существование, у обоих есть свои преимущества и недостатки.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858596
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDimitry Sibiryakovпропущено...

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


Связанный список и надо использовать. Т.е. что значит -- надо ? Обычно так делают.

SashaMercury, у тебя это даже не совсем стек. Т.е. стек, но на базе массива.
А обычно делают стек на базе связного/двусвязного списка.
Хотя, конечно, и такой стек имеет право на существование, у обоих есть свои преимущества и недостатки.

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

PS
В каком году появился связный список, и в каком году Алан Тьюринг придумал стек ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858598
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

SSВ каком году появился связный список, и в каком году Алан Тьюринг придумал стек ?
До середины 20 века появился стек. А ответ на первый вопрос я не знаю, ту книгу что вы мне рекомендовали(об истории IT), пока даже не прочитал
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38858661
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryPS
В каком году появился связный список, и в каком году Алан Тьюринг придумал стек ?

Году в 50-55 стек придумали.
Это если аппаратно первая ЭВМ была без стека.
Если была -- ещё раньше, в 45.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859093
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSashaMercuryPS
В каком году появился связный список, и в каком году Алан Тьюринг придумал стек ?

Году в 50-55 стек придумали.
Это если аппаратно первая ЭВМ была без стека.
Если была -- ещё раньше, в 45.

Так и предполагал.

Значит проблему с функцией push() в данном примере нельзя решить ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859118
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно и так:
return SEMPTY; ----> raise(SIGSEGV);
Вполне подходит по смыслу к попытке достать число из пустого стека.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859132
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wst,

если вы комментировали моё сообщение про push(), то я о другом спрашиваю . А вы говорите про функцию pop()
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859185
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стек я бы делал, как выше писали, в виде связанного списка массивов.
Это минимизирует аллокации, не требует реаллокаций, и не требует при создании стека заранее задавать размер.

Задача контроля за чрезмерным выделением памяти не должна влиять на структуру данных. Никто вам не мешает контролировать это при любой реализации.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859202
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
не очень понятно. Как он может не требовать реаллокации ? Только в том случае если мы выделили памяти сразу столько, сколько нужно
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859276
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Каждый вызов push() аллоцирует объём памяти, равный размеру данных плюс размер указателя на следующий элемент. Каждый pop() освобождает такой же объём; реаллокации нет.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859278
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Все эти споры дают понять, почему в STL стек и очередь -- это адаптеры, реализованные над тремя базовыми структурами -- vector, deque и list.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859317
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolf,
теперь понятно

Ладно, с учётом того что сейчас это сделано так, как всё-таки решить проблему выделенную жёлтым цветом ? Возможно ли это в данной реализации ?


Anatoly Moskovsky,
как же контролировать объём данных ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859484
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryкак всё-таки решить проблему выделенную жёлтым цветом ?
Убрать скобки. И в следующей строке - тоже.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859538
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елы-палы, я не заметил этот вопрос...
Да всё просто -- литерал с именем функции -- это переменная с типом "указатель на функцию с данной сигнатурой".
Так что -- да, достаточно в строке убрать скобки.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859547
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следующая за жёлтой строка, кстати, неверна.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859716
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЛадно, с учётом того что сейчас это сделано так, как всё-таки решить проблему выделенную жёлтым цветом ? Возможно ли это в данной реализации ?

Как исправить - уже сказали.
Но суть в том что указатели на функции в экземплярах объекта вообще не нужны - там нет никакого полиморфного поведения. Используйте обычные свободные функции.


SashaMercuryкак же контролировать объём данных ?
Хранить кол-во элементов и в push проверять достигнут ли предел.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859771
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНо суть в том что указатели на функции в экземплярах объекта
вообще не нужны - там нет никакого полиморфного поведения.
В данном случае - да, не нужны. Поскольку применяются (точнее применялись) именно только
тогда, когда полиморфизм необходим.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859774
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В push() тоже самое - если места нет то raise(SIGSEGV).
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859784
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wstВ push() тоже самое - если места нет то raise(SIGSEGV).
А чего ж уж сразу не abort()?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859845
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это вобщем напоминает лабы на 1 курсе где мы изучали списки, однонаправленные, двунаправленные
и скип-списки.

Саш. Дался тебе этот стек. Давай чё нить полезное пилить.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859854
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И на С++, а не на голом С...
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859868
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не abort() потому что
1) SIGSEGV - Invalid access to storage like segment violation - вполне подходит по теме.
И да, никто не запрещает этот сигнал обработать, не прибивая программу если это действительно нужно.
2) SIGABRT, посылаемый абортом уже немного не то.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859874
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потонем в советах. Мне кажется что С++ и обработка сигналов это каг-бе разные левелы
разработки. Нет конешно я не против. Но давненько не брал в руки шашек. Как там принято
грамотно вывалится из С++ приложения в ОС.

Бросив экцепшен? Или всё таки послать сигнал?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859886
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДавай чё нить полезное пилить.... сказал человек, превращающий пяток условных операторов в логическое непотребство
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38859960
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дай бох кому-то хоть интерес поднял. По сабжу С++ весьма уныл на дискурсы.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860125
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДай бох кому-то хоть интерес поднял. По сабжу С++ весьма уныл на дискурсы.
Потому что в нем на базовом уровне не нужно заниматься такой увлекательной ерундой, как указатели на функции и ручное управление памятью. ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860127
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте не будем off. А то получите все от меня банан. И какой пример подаём мемберам?


По сабжу есть чего. Сигналы или Exceptions? Best practices.

Вася. Толик.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860184
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСигналы или Exceptions? Best practices.
Если С - то код возврата, если С++ то исключения.

Ну еще можно проверять условие и вызывать abort(). (Т.к. в принципе программа читающая из пустого стека некорректна и ее надо завершить пока она там че-то посерьезнее не натворила)
Но этот вариант не всегда приемлем с точки зрения удобства пользователя - не каждому захочется пользоваться программой которая при любом чихе завершается не сохранив введенную информацию
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860220
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток C:

maytonПотонем в советах. Мне кажется что С++ и обработка сигналов это каг-бе разные левелы
разработки. Нет конешно я не против. Но давненько не брал в руки шашек. Как там принято
грамотно вывалится из С++ приложения в ОС.
Бросив экцепшен? Или всё таки послать сигнал?

сразу вспомнил известную песенку Лаза из Лукьяненко :D
авторДавно я не давил кишку наружу,
Давным-давно кишку наружу не давил,
И вот совсем недавно обнаружил,
Что я давно кишку наружу не давил.
А ведь бывало я как выдавлю наружу!
Никто из наших так наружу не давил!
И я один за всех давил наружу,
За все наружу я тогда один давил!
Бывает, щас я иногда давлю наружу,
Но это щас, совсем не как тогда.
Совсем не так давиться наружу,
Давить, как раньше, я не буду никогда.
:D

ну да ладно. сейчас проверю скобки
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860224
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, MasterZiv

вы правы. Спасибо
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860225
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySSкак же контролировать объём данных ?
Хранить кол-во элементов и в push проверять достигнут ли предел.

так и делаю. Разве нет ?

mayton
Саш. Дался тебе этот стек. Давай чё нить полезное пилить.

Давайте :)
Но структуры данных я должен научиться сам делать. Предполагаю они уже реализованы в стандартных библиотеках, но нужно самому разобраться какими способами их можно реализовать.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860227
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryтак и делаю. Разве нет ?
Вы так и делаете, потому что по-другому с той структурой нельзя - только заранее задать размер.
А если по техзаданию не должно быть такого лимита, то ваша структура в пролете.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860275
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymaytonСаш. Дался тебе этот стек. Давай чё нить полезное пилить.

Давайте :)
Но структуры данных я должен научиться сам делать. Предполагаю они уже реализованы в стандартных библиотеках, но нужно самому разобраться какими способами их можно реализовать.
хе, давай бинарные деревья с PathCoping, что стэки то мучать
Decart Tree (для олимпиад самое то), AVL, RB, Weight-balanced тоже очень интересен

глядишь и до concurrent структур дойдём :-)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860337
yugl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, об этом еще никто не написал, функция push должна параметр el как-то использовать, видимо.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860604
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДавайте :)
Но структуры данных я должен научиться сам делать. Предполагаю они уже реализованы в стандартных библиотеках, но нужно самому разобраться какими способами их можно реализовать.
Уважаю Лукьяненко. Но стишки у него во всех книгах - позорные.

По теме стека. Как говорил Илья - это тема избитая. И stl ее шаблонизирует.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860622
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)хе, давай бинарные деревья с PathCoping, что стэки то мучать
Decart Tree (для олимпиад самое то)
Еслия правильно понял это круть несусветная для поиска в диапазонах.

Я вот думал над оптимальным планом поиска. Дано.

Код: plsql
1.
create table fuckenOperations(id number primary key, begin date, end date);



Код: plsql
1.
create index idx_begin on fuckenOperations(begin);



Код: plsql
1.
create index idx_end on fuckenOperations(end);



Код: plsql
1.
select * from fuckenOperations where #{eventDate} between begin and end;



Коробочные решения dbms обычно не умеют использовать оба индекса одновременно.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860644
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКоробочные решения dbms обычно не умеют использовать оба индекса одновременно.
У них есть статистики распределения значений в индексе, для грубой оценки какой индекс лучше подходит.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860648
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКоробочные решения dbms обычно не умеют использовать оба индекса
одновременно.
Не одновременно, но умеют. Firebird, например, раскладывает условие between на >= и <=?, а
потом сначала достаёт битовую маску записей из одного индекса для первого условия, потом
из второго, а потом их складывает и по результату выбирает собственно записи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860762
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonКоробочные решения dbms обычно не умеют использовать оба индекса одновременно.
У них есть статистики распределения значений в индексе, для грубой оценки какой индекс лучше подходит.
Тут дело не в статистиках. Возьмём к примеру даже абсолютный RULE_BASED_OPTIMIZER.
А дело в том что в большинстве DBMS нет возможности реализовать этот кейс с двумя индексами
одновременно.

Есть кластеризация и партишионинг. Но это другое. Это просто сужает область поиска.

Единственно что действительно оптимизировано для поиска точки в множестве интервалов
это гео-поиск (spatial структуры), RadixTree и, возможно этот замечлательный Decart Tree.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860771
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonkealon(Ruslan)хе, давай бинарные деревья с PathCoping, что стэки то мучать
Decart Tree (для олимпиад самое то)
Еслия правильно понял это круть несусветная для поиска в диапазонах.

Я вот думал над оптимальным планом поиска. Дано.

Код: plsql
1.
create table fuckenOperations(id number primary key, begin date, end date);



Код: plsql
1.
create index idx_begin on fuckenOperations(begin);



Код: plsql
1.
create index idx_end on fuckenOperations(end);



Код: plsql
1.
select * from fuckenOperations where #{eventDate} between begin and end;



Коробочные решения dbms обычно не умеют использовать оба индекса одновременно.

Rushmore в FoxPro вроде ровно это и делал (пересечения индексов), но его купили только заради этого патента, а в MSSQL видимо вставить забыли.
А может и не забыли.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860774
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima Tпропущено...

У них есть статистики распределения значений в индексе, для грубой оценки какой индекс лучше подходит.
Тут дело не в статистиках. Возьмём к примеру даже абсолютный RULE_BASED_OPTIMIZER.
А дело в том что в большинстве DBMS нет возможности реализовать этот кейс с двумя индексами
одновременно.


Почему нет возможности ? Возможность есть, нет патента (или надо за использование платить).
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860792
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошая тема по поводу MSSQL. Тестил на Ораклах, Постгресах, МайСКЛ.

Надо потестить еще на МС.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860794
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivRushmore в FoxPro вроде ровно это и делал (пересечения индексов)
рашмор такие пересечения не оптимизирует
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table fuckenOperations (id i, begin d, end d)
insert into fuckenOperations values (1, date() - 10, date() - 5)
insert into fuckenOperations values (2, date() - 7, date() + 5)
insert into fuckenOperations values (3, date() + 3, date() + 10)
index on begin tag idx_begin 
index on end tag idx_end 

sys(3054, 12) && Вкл. вывод работы оптимизатора
select * from fuckenOperations where date() between begin and end

Результатselect * from fuckenOperations where date() between begin and end
Rushmore optimization level for table fuckenoperations: none
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860917
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivRushmore в FoxPro вроде ровно это и делал (пересечения индексов)
рашмор такие пересечения не оптимизирует
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table fuckenOperations (id i, begin d, end d)
insert into fuckenOperations values (1, date() - 10, date() - 5)
insert into fuckenOperations values (2, date() - 7, date() + 5)
insert into fuckenOperations values (3, date() + 3, date() + 10)
index on begin tag idx_begin 
index on end tag idx_end 

sys(3054, 12) && Вкл. вывод работы оптимизатора
select * from fuckenOperations where date() between begin and end

Результатselect * from fuckenOperations where date() between begin and end
Rushmore optimization level for table fuckenoperations: none


Да теперь уже и не выяснить точно.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38860945
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть упоминания в разделах MS Vis FoxPro.

Using Rushmore Query Optimization to Speed Data Access
https://msdn.microsoft.com/en-us/library/1f5d2sa3(v=vs.80).aspx

Но не могу найти связей или ссылок к MSSQL.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38861061
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну не знаю, может и глюки у меня.
ложная память.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38861150
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА может и не забыли.
насколько я помню - не забыли
давно читал о судьбе оного
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38861343
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа теперь уже и не выяснить точно.
Я же тебе показал сообщение фокспрошного оптимизатора. "none" - значит не используется рашмор.

maytonНо не могу найти связей или ссылок к MSSQL.
Связь на уровне слухов: движок MSSQL допиливала та же команда разработчиков, которая делала фокс.

PS Фоксовый рашмор был супер-технологией 25 лет назад, когда его изобрели. После этого каких-то серьезных доработок движка не было. MS после покупки FoxPro 2.0 DOS допилил только интерфейсную часть (перевел под виндовс).
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38861355
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
рашмор такие пересечения не оптимизирует
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table fuckenOperations (id i, begin d, end d)
insert into fuckenOperations values (1, date() - 10, date() - 5)
insert into fuckenOperations values (2, date() - 7, date() + 5)
insert into fuckenOperations values (3, date() + 3, date() + 10)
index on begin tag idx_begin 
index on end tag idx_end 

sys(3054, 12) && Вкл. вывод работы оптимизатора
select * from fuckenOperations where date() between begin and end

Результатselect * from fuckenOperations where date() between begin and end
Rushmore optimization level for table fuckenoperations: none

Поэксперементировал немного, если запрос переписать так
Код: sql
1.
select * from fuckenOperations where begin <= date() and end >= date()


соптимизируется рашмором и задействует оба индекса.
логи оптимизатораUsing index tag Idx_begin to rushmore optimize table fuckenoperations
Using index tag Idx_end to rushmore optimize table fuckenoperations
Rushmore optimization level for table fuckenoperations: partial
Скорее всего произойдет следующее: прочитаются оба индекса, из каждого выберутся указатели на записи удовлетворяющие условию, найдется пересечение, прочитаются записи попавшие в пересечение.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38861708
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я себе понимаю этот план требует полного обхода двух индексов
и генерации биткарты типа 2 колонки на количество строк в индексе с последущей
булевой операцией пересечения этих двух бит-признаков.

Верно?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38861733
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полный обход только части индекса. Например для условия key >= X сначала находим X (или ближайшее меньшее) и дальше перебор всех последующих.

В остальном верно.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38861741
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот вы пофлеймить, господа
лучше бы структуры написали которые стоит поковырять

2 mayton, под Decart Tree имелось ввиду бинарное Декартово дерево (которое в качестве Ordered Map можно использовать), а не декартово дерево отрезков
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38861976
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan), структуры которые стоит поковырять? Ну... давай список. Мыж не Базисты.

Мне вообще всегда интересна прикладная задача в применении к структурам.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38862128
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

От умеют люди испортить топик. Особенно модераторы
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38862210
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы не поверите что вчера было.

Мне вчера принесли книгу Бьёрна Страуструпа, но она 2001 года. Я зашел в книжный магазин, ибо мало ли чего в последней версии изменили, хотел купить новую. Той книги там конечно не было(буду читать что есть). Зато я встретил книгу про Java, автор Роберт Лафоре. Называется примерно "Cтруктуры и алгоритмы на Java". Не удержался, и вы знаете что я нашёл в содержании и затем открыл. И когда посмотрел как реализован стек, то удивился, ибо максимальный размер стека хранился в структуре Stack.

Я конечно больше верю Анатолию, и вероятно так не стоит делать (хотя сам для себя ещё не доказал почему не стоит), но зато пришел к выводу, что и в книгах бывают вот такие ошибки или как минимум неоднозначно правильные реализации.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38862239
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

почему же ошибки?

Все приведённые варианты "правильны"
главное чтоб применялись адекватно задаче.

Для встроенной системы, например, вполне адекватно выглядит стек на базе статического массива фиксированного размера
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38862267
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Тут надо понимать, что у автора книги нет задачи создать применимую на практике программу.
У него задача - продать книгу
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38862378
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саш. Есть разные уровни понимания и приятия наук. Это как классическая механика и СТО. Они
не противоречат друг другу. Просто одна из них дополняет и расширяет другую. Смысл операций
со стеком можно объянисть одной картинкой. Или примером из жизни. А как его закодить на конкретном
ЯП под конкретные ЗАДАЧИ - это другой левел понимания. Стек может быть нативным (сегмент стека
в ассемблерной программе) или реализованным поверх массива, списка, дека. Или каких нибудь
древоводиных структур. Это всё - СТЕКИ. И они все правильные.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38862501
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк,
нет, классическая механика это только приближение к реальному положению дел при малых скоростях(и вполне возможно что специальная теория относительности также приближение).


Тогда, скорее все они(реализации стека) неправильные. У каких-то больше недостатков, у каких-то меньше. Ну да ладно, главное, вашу идею понял, только интерпретация будет такая, как написал предложением выше :)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38862521
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо так прямолинейно переносить "игры разума" (компьютеры) на реальную жизнь (физика).
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38862928
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

Анатолий, кажется я понял почему вы говорили что не стоит хранить максимальное число элементов в структуре Stack.
Если все стеки предполагаются одинакового размера, то смысла в этом действительно нет никакого. Но моё проектирование было рассчитано на создание стеков различной мощности, потому размер привязал к объекту. Правильно ли я понял ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38862944
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЕще лучше кидать исключение, но их нет в С.

Можно их имитировать через setjump/longjump.

Спасибо за совет. Странно, в стандарте Си не нашёл об этом ничего. По ощущениям, это как-то связано с goto
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38862974
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryАнатолий, кажется я понял почему вы говорили что не стоит хранить максимальное число элементов в структуре Stack.
Я такое не говорил ))
Я говорил что не стоит закладывать такое ограничение в сам дизайн стека. Т.е. стек должен быть произвольного размера, а ограничение, если оно нужно, - проверять отдельно от реализации стека.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38863264
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryАнатолий, кажется я понял почему вы говорили что не стоит хранить максимальное число элементов в структуре Stack.
Я такое не говорил ))
Я говорил что не стоит закладывать такое ограничение в сам дизайн стека. Т.е. стек должен быть произвольного размера, а ограничение, если оно нужно, - проверять отдельно от реализации стека.

а где хранить эти ограничения на стек ? Это я к тому, что пусть в программе будет использоваться 100 стеков, например
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38863271
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
а где хранить эти ограничения на стек ? Это я к тому, что пусть в программе будет использоваться 100 стеков, например

1. просто переменную заводишь и проверяешь её если нужно ограничение
2. а количество элементов только памятью доступной должно быть ограничено
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38863276
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),
100 переменных заводить для 100 стеков ? Или массив переменных ?)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38863288
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurykealon(Ruslan),
100 переменных заводить для 100 стеков ? Или массив переменных ?)

вот ответь на вопрос, зачем тебе стек надо ограничить?

это имеет смысл только если ты пытаешься сделать его ускоренную реализацию, резервируя память заранее, но для этого проще новый класс написать
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38863306
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

это имеет смысл как вопрос безопасности. Нет ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38863316
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)это имеет смысл только если ты пытаешься сделать его ускоренную реализацию, резервируя память заранее, но для этого проще новый класс написать
На самом деле, реализация в виде списка массивов по скорости ничем не уступает просто массиву ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38863397
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Горчо любимый realloc(..) не нужен. Просто выделяем еще EXTENT и полетел стек как птица...
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38863854
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskykealon(Ruslan)это имеет смысл только если ты пытаешься сделать его ускоренную реализацию, резервируя память заранее, но для этого проще новый класс написать
На самом деле, реализация в виде списка массивов по скорости ничем не уступает просто массиву ))
конечно не уступает, это уже крайний случай когда всё упрощается до беспредела в целях выжать всё возможное из системы

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

2 SashaMercury: нет смысла маниакально следить за ресурсами, преждевременная оптимизация - зло (достаточно представлять как работает и знать слабые места)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38863891
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

по поводу структур и их реализаций
есть библиотека FCL-STL, она является частью fpc (скачать можно отсюда http://www.freepascal.org)

исходники у неё очень просто и понятно написаны (куда проще чем GNU STL для C++) , лежат
fpc\{версия}\source\packages\fcl-stl\
там же есть и дока (цена операций и пр.)

для обучения и сравнения самое то
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38865442
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury ,

вот ещё структурка
Rope (Верёвка)
для нахождения агрегатов за O(log(N)), можно на основе Weight-balanced дерева сделать
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38876498
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Правильно ли я помню, что при проектировании структуры, в случае, когда на объект структуры предполагаются операции связанные с аллоцированием, необходимо расположить этот элемент последним ? fe
Код: plaintext
1.
2.
3.
4.
5.
6.
struct temp
{
    T0 count;
    T1 smth_else;
    T2* will_allocate_memory;
}



Подскажите пожалуйста
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38876518
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.
Правильно ли я помню, что при проектировании структуры, в случае, когда на объект структуры предполагаются операции связанные с аллоцированием, необходимо расположить этот элемент последним ? fe
Код: plaintext
1.
2.
3.
4.
5.
6.
struct temp
{
    T0 count;
    T1 smth_else;
    T2* will_allocate_memory;
}



Подскажите пожалуйстаВ данном случае это не важно. Указатель это объект вполне определенного размера, а значит он может быть где угодно внутри структуры.

Другое дело, если ты изначально собираешься сделать структуру с переменной длиной, тогда массив надо делать последним:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
struct temp
{
    T0 count;
    T1 smth_else;
    T2 will_allocate_memory[0];
}

sizeof(struct temp) == sizeof(T0)+sizeof(T2); /// always!

struct temp *t = malloc( sizeof(struct temp) + sizeof(T2)*N );
t.will_allocate_memory[N-1]; // Ok
t.will_allocate_memory[N]; // memory access violation
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877145
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
но позже я могу выделить память по этому указателю
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877183
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryWhite Owl,
но позже я могу выделить память по этому указателюи что? выделенная память не будет лежать в структуре. Память выделится в куче, что на размер структуры не скажется никоим образом.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877184
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне уже пора..Спасибо, завтра буду разбираться в чём ошибаюсь.


наконец сегодня появилось время на кино. Игра в имитацию очень понравилась C: Не смог удержаться и не рассказать, извините
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877189
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryWhite Owl,
но позже я могу выделить память по этому указателюи что? выделенная память не будет лежать в структуре. Память выделится в куче, что на размер структуры не скажется никоим образом.

Спасибо. Так и есть
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877203
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlДругое дело, если ты изначально собираешься сделать структуру с переменной длиной, тогда массив надо делать последним:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
struct temp
{
    T0 count;
    T1 smth_else;
    T2 will_allocate_memory[0];
}

sizeof(struct temp) == sizeof(T0)+sizeof(T2); /// always!

struct temp *t = malloc( sizeof(struct temp) + sizeof(T2)*N );
t.will_allocate_memory[N-1]; // Ok
t.will_allocate_memory[N]; // memory access violation

а я не понял. T2 will_allocate_memory[ 0 ]; это как? с каких пор массив нулевой длины не является ошибкой компиляции? и откуда потом взялось N?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877214
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

это фича gcc.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877220
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolfэто фича gcc.
Это все компиляторы умеют.
Если не ошибаюсь даже в стандарт уже внесли. C++ как минимум
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877222
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychа я не понял. T2 will_allocate_memory[ 0 ]; это как? с каких пор массив нулевой длины не является ошибкой компиляции?
В конце структуры позволяется.
И предназначено как раз для целей, описанных White Owl
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877231
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyegorychа я не понял. T2 will_allocate_memory[ 0 ]; это как? с каких пор массив нулевой длины не является ошибкой компиляции?
В конце структуры позволяется.
И предназначено как раз для целей, описанных White Owlда, немного погуглив, разобрался, спасибо за разъяснения
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877238
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а я правильно понимаю, что таковую структуру на стеке не разместишь?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877323
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychа я правильно понимаю, что таковую структуру на стеке не разместишь?Почему же не разместишь? Запросто. только не забывай что sizeof(struct temp) == sizeof(T0)+sizeof(T2);

То есть вполне можно сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct temp
{
    T0 count;
    T1 smth_else;
    T2 will_allocate_memory[0];
}

void foo() {
   struct temp t;

   t.count = 123;  /// Ok
   t.smth_else = some_data; /// Ok
   t.will_allocate_memory[0] /// error
}
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877327
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
>> не забывай что sizeof(struct temp) == sizeof(T0)+sizeof(T2);
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct temp
{
    T0 count;
    T1 smth_else;
    T2 will_allocate_memory[0];
}
 
sizeof(struct temp) == sizeof(T0)+sizeof(T1);

T1, а не T2?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877340
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychWhite Owl,
>> не забывай что sizeof(struct temp) == sizeof(T0)+sizeof(T2);
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct temp
{
    T0 count;
    T1 smth_else;
    T2 will_allocate_memory[0];
}
 
sizeof(struct temp) == sizeof(T0)+sizeof(T1);

T1, а не T2?Да, конечно. Опечатался, прошу прощения.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877502
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

На стеке:
Код: plaintext
1.
2.
3.
4.
union {
struct temp t;
char fill[sizeof(struct temp) + sizeof(T2)*N];
};
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877517
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyegorych,

На стеке:
Код: plaintext
1.
2.
3.
4.
union {
struct temp t;
char fill[sizeof(struct temp) + sizeof(T2)*N];
};

жёстко ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877519
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

Что, жестче чем malloc(sizeof(struct temp) + sizeof(T2)*N) ? :)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877648
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyegorych,

Что, жестче чем malloc(sizeof(struct temp) + sizeof(T2)*N) ? :)через union позаковырестей, чем malloc, всё же :))
А где используются такого рода извращения, интересно?

и, мне кажется, что
Код: plaintext
1.
2.
3.
4.
union {
struct temp t;
char fill[sizeof(struct temp) + sizeof(T2)*N];
};

если N - не константа, то это ведь нестандартное расширение гнуса, нет?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38877814
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychесли N - не константа, то это ведь нестандартное расширение гнуса, нет?
Это стандартное, но только в С.
В С++ такого нет
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878167
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlegorychWhite Owl,
>> не забывай что sizeof(struct temp) == sizeof(T0)+sizeof(T2);
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct temp
{
    T0 count;
    T1 smth_else;
    T2 will_allocate_memory[0];
}
 
sizeof(struct temp) == sizeof(T0)+sizeof(T1);

T1, а не T2?Да, конечно. Опечатался, прошу прощения.

а не
Код: plaintext
1.
 sizeof(T0)+sizeof(T1)+sizeof(T2)



?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878172
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем вообще хранить структуру переменной длинны ? Где это можно применить, например ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878174
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему бы не хранить в таком случае указатель на память, где будет храниться необходимые нам данные разной мощности
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878181
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury а не

нет.

SashaMercury Где это можно применить, например ?

разбор пакетов, скажем: заголовок + данные переменной длины.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878207
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot RWolf]SS а не

нет.


почему нет ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878219
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryпочему нет ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
C:\2>type 1.c
#include <stdio.h>

struct temp
{
    char count;
    char smth_else;
    char will_allocate_memory[0];
};

int main(int argc, char* argv[])
{
  printf("%d\r\n", sizeof(struct temp));
  return 0;
}

C:\2>gcc 1.c

C:\2>a
2

C:\2>
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878222
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolf,

и что ?
эти 2 могут получиться разными путями.

почему ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878223
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

не могут.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878248
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolf,

тогда в данном случае это скорее сумма размеров T0 и T1. Объясните почему должна быть сумма T0 и T2, и почему в размере структуры не учитывается размер T1
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878254
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

в посте так и написано:
Код: plaintext
1.
sizeof(struct temp) == sizeof(T0)+sizeof(T1);
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878263
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych , потому я и спросил по этому вопросу. T1 исправили на T2.

White OwlegorychWhite Owl,
>> не забывай что sizeof(struct temp) == sizeof(T0)+sizeof(T2);
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct temp
{
    T0 count;
    T1 smth_else;
    T2 will_allocate_memory[0];
}
 
sizeof(struct temp) == sizeof(T0)+sizeof(T1);

T1, а не T2?Да, конечно. Опечатался, прошу прощения.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878264
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryRWolf,

тогда в данном случае это скорее сумма размеров T0 и T1. Объясните почему должна быть сумма T0 и T2, и почему в размере структуры не учитывается размер T1смотри, чё: 17252093
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878275
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryegorych , потому я и спросил по этому вопросу. T1 исправили на T2.наоборот, Т2 исправили на Т1, изначально вкралась опечатка. Правильный sizeof:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct temp
{
    T0 count;
    T1 smth_else;
    T2 will_allocate_memory[0];
}
 
sizeof(struct temp) == sizeof(T0)+sizeof(T1);

sizeof( T2 ) не участвует в расчёте размера структуры, потому что мы говорим, что будет массив переменной длины, и, типа, мы сами-с-усами и зададим потом правильный размер. Компилятор говорит нам: Ок, теперь ты сам-себе-злобный-буратино, а я не буду учитывать размер последнего массива при расчёте размера структуры.
Как то так мне это видится ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878294
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryegorych , потому я и спросил по этому вопросу. T1 исправили на T2.наоборот, Т2 исправили на Т1, изначально вкралась опечатка. Правильный sizeof:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct temp
{
    T0 count;
    T1 smth_else;
    T2 will_allocate_memory[0];
}
 
sizeof(struct temp) == sizeof(T0)+sizeof(T1);

sizeof( T2 ) не участвует в расчёте размера структуры, потому что мы говорим, что будет массив переменной длины, и, типа, мы сами-с-усами и зададим потом правильный размер. Компилятор говорит нам: Ок, теперь ты сам-себе-злобный-буратино, а я не буду учитывать размер последнего массива при расчёте размера структуры.
Как то так мне это видится ))

Мне так и думалось. Спасибо :)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38878668
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryegorych , потому я и спросил по этому вопросу. T1 исправили на T2.наоборот, Т2 исправили на Т1, изначально вкралась опечатка. Правильный sizeof:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct temp
{
    T0 count;
    T1 smth_else;
    T2 will_allocate_memory[0];
}
 
sizeof(struct temp) == sizeof(T0)+sizeof(T1);

sizeof( T2 ) не участвует в расчёте размера структуры, потому что мы говорим, что будет массив переменной длины, и, типа, мы сами-с-усами и зададим потом правильный размер. Компилятор говорит нам: Ок, теперь ты сам-себе-злобный-буратино, а я не буду учитывать размер последнего массива при расчёте размера структуры.
Как то так мне это видится ))
sizeof(struct temp) не всегда равно sizeof(T0)+sizeof(T1), есть ещё выравнивание
Такой вид структур-хаков довольно распространён. В дельфях, например, встроенные типы String, Array of имеют такую же структуру, это помогает избегать лишнего выделения памяти и наверное благоприятно сказывается на скорости, из-за того что данные в одном месте (кэш процессора не перегружается)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38879925
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До кучи. Статья на тему

http://tproger.ru/translations/art-of-structure-packing/
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38881311
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
В Си отсутствует перегрузка функций ? (это относится к структурам, проектирую дерево, и возник такой вопрос). Почему отсутствует ?

PS
Марк, а хорошая статья. Читаю сейчас, нравится.
Странно, у меня на столе лежит Цилькер, Орлов Организация ЭВМ и систем, и я почему-то не нашел у них про так называемое выравнивание
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38881872
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПочему отсутствует ?Потому, что компоновщик не понимает такого авангарда как одно имя у двух точек входа.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882041
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.
В Си отсутствует перегрузка функций ? (это относится к структурам, проектирую дерево, и возник такой вопрос). Почему отсутствует ?
А для понимания этих вопросов надо читать Michael Scott, Programming Language Pragmatics.

SashaMercuryPS
Марк, а хорошая статья. Читаю сейчас, нравится.
Странно, у меня на столе лежит Цилькер, Орлов Организация ЭВМ и систем, и я почему-то не нашел у них про так называемое выравниваниеА это кто такие? Мировой общественности эти имена не известны.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882050
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСтранно, у меня на столе лежит Цилькер, Орлов Организация ЭВМ и систем, и я почему-то не нашел у них про так называемое выравнивание
страница 80
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882079
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСтранно, у меня на столе лежит Цилькер, Орлов Организация ЭВМ
Ну ты... дал джазу.

У меня при слове ЭВМ начинается когнитивный диссонанс и раскаты смеха. Еще-бы написали "табулятор". Или счётная "машинка".
Честно скажу я нечитал этих замечательных людей. Но сам факт заимствования терминологии из середины 20-го века
доставляет. Ну да бох с ними.

Вобщем обхохтался... Фух.

Вобщем я за 30 секунд тебе нагуглил:

Кури ключевые слова padding .

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882086
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВ Си отсутствует перегрузка функций ? (это относится к структурам, проектирую дерево, и возник такой вопрос). Почему отсутствует ?
Basil A. SidorovПотому, что компоновщик не понимает такого авангарда как одно имя у двух точек входа.
Никаких технических причин для этого нет.
С++ например использует тот же компоновщик, и это не мешает ему иметь перегрузки.

Единственная причина по которой в С нет перегрузок - это консервативность разработчиков языка, которые по максимуму охраняют синтаксис и простоту языка.
И в принципе их можно понять. Снобизм вообще понятная штука ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882088
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyС++ например использует тот же компоновщик, и это не мешает ему иметь перегрузкиТолько потому, что компоновщику совершенно по барабану как именно компилятор задекорирует имя. Одно имя на две точки входа он (компоновщик) всё равно не умеет.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882094
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyИ в принципе их можно понять. Снобизм вообще понятная штука ))
Не снобизм. Это последовательность эволюции. Никто не ставил задачи впихнуть всё фишки в квази-ассемблер для Юникса.
"С" на тот момент и так был прорывом.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882116
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovТолько потому, что компоновщику совершенно по барабану как именно компилятор задекорирует имя. Одно имя на две точки входа он (компоновщик) всё равно не умеет.
Так я и говорю. Линкер тут вообще не причем. Если компилятор захочет он найдет как организовать перегрузку. Но он не хочет ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882118
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton"С" на тот момент и так был прорывом.
А я не про тот момент. Я про этот.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882133
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня при слове ЭВМ начинается когнитивный диссонанс и раскаты смеха. Еще-бы написали "табулятор". Или счётная "машинка".
Честно скажу я нечитал этих замечательных людей. Но сам факт заимствования терминологии из середины 20-го века
доставляет. Ну да бох с ними
ничего там страшного нет
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882160
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskymayton"С" на тот момент и так был прорывом.
А я не про тот момент. Я про этот.
А ну ОК. А почему только "С" ? Давайте поставим общий вопрос.

Перегрузка операторов в современных ЯП. Прошлое. Настоящее. Будущее.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882169
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Похоже на название топика в другом форуме ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882172
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В программинге? Или в ПТ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882174
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ программинге? Или в ПТ?
Это вопрос к модератору
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882193
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА ну ОК. А почему только "С" ? Давайте поставим общий вопрос.

Перегрузка операторов в современных ЯП. Прошлое. Настоящее. Будущее.

может глобальнее поставить: зачем вообще нужна перегрузка операторов?
Лично мне интересно. Побаловался с этой темой тыкаясь в С++, но как-то не заценил.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882204
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, подними новый тред в С++.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882205
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonА ну ОК. А почему только "С" ? Давайте поставим общий вопрос.

Перегрузка операторов в современных ЯП. Прошлое. Настоящее. Будущее.

может глобальнее поставить: зачем вообще нужна перегрузка операторов?
Лично мне интересно. Побаловался с этой темой тыкаясь в С++, но как-то не заценил.

странно, по-моему так достаточно очевидно:
-- для того, чтобы не думать очень долго над названием функции
-- для того, чтобы иметь возможность реализовывать user defined data types , встроенные в языке, и передумать для них разные операции.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882361
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
нашел :)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882363
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDima Tпропущено...

может глобальнее поставить: зачем вообще нужна перегрузка операторов?
Лично мне интересно. Побаловался с этой темой тыкаясь в С++, но как-то не заценил.

странно, по-моему так достаточно очевидно:
-- для того, чтобы не думать очень долго над названием функции
-- для того, чтобы иметь возможность реализовывать user defined data types , встроенные в языке, и передумать для них разные операции.

Лично для меня, дело даже не в том чтобы подумать о названии функций, а в том, что на незачем создавать кучу функций с разными именами только из-за того, что у них разные параметры, поскольку смысловая нагрузка на функции сохраняется
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882373
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЛично для меня, дело даже не в том чтобы подумать о названии функций, а в том, что на незачем создавать кучу функций с разными именами только из-за того, что у них разные параметры, поскольку смысловая нагрузка на функции сохраняетсяТы хочешь перегрузку функций в Си? Ну и запросто, объектное программирование никто не отменял.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882379
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlSashaMercuryЛично для меня, дело даже не в том чтобы подумать о названии функций, а в том, что на незачем создавать кучу функций с разными именами только из-за того, что у них разные параметры, поскольку смысловая нагрузка на функции сохраняетсяТы хочешь перегрузку функций в Си? Ну и запросто, объектное программирование никто не отменял.

Ниже код на С++, с использованием перегрузки функций

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
struct TreeNode* createTreeNode()
{
	struct TreeNode* tn = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	tn->w = NULL;
	tn->count = 0;
	tn->left = NULL;
	tn->right = NULL;
	return tn;
}

struct TreeNode* createTreeNode(const char* w)
{
	struct TreeNode* tn = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	tn->w = NULL;
	tn->w = (char*)malloc(sizeof(char)*(strlen(w)+1));
	strcpy(tn->w, w);
	tn->count = 1;
	tn->left = NULL;
	tn->right = NULL;
	return tn;
}



как вы предлагает сделать аналогичное на Си ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882380
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше так,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
struct TreeNode* createTreeNode()
{
	struct TreeNode* tn = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	tn->w = NULL;
	tn->count = 0;
	tn->left = tn->right = NULL;
	return tn;
}

struct TreeNode* createTreeNode(const char* w)
{
	struct TreeNode* tn = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	tn->w = NULL;
	tn->w = (char*)malloc(sizeof(char)*(strlen(w)+1));
	strcpy(tn->w, w);
	tn->count = 1;
	tn->left = tn->right = NULL;
	return tn;
}
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882383
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк, а что не так в слове ЭВМ ? Или ВМ
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882398
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДо кучи. Статья на тему

http://tproger.ru/translations/art-of-structure-packing/

Однако, в этой работе есть ряд вопросов рассмотрен не полностью.
1. Применяется ли концевое заполнение в том случае, если после структуры располагается не элемент такого-же типа ? Вообще, концевое заполнение необходимо лишь в том случае, если объявляется массив структур
2. Смутили тривиальные предложения

авторПрежде чем мы коснемся структур, следует упомянуть массивы скалярных величин. На платформе с выравниванием данных массивы char/short/int/long или указателей располагаются в памяти последовательно, без заполнения.

3. Тут возможно ошибка
авторБитовые поля позволяют объявить переменные, занимающие меньшую, чем char память, вплоть до 1 бита. Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct foo5 {
    short s;
    char c;
    int flip:1;
    int nybble:4;
    int septet:7;
};




Важно помнить, что они реализованы с помощью маски поверх байта или машинного слова и не могут выходить за его пределы.

С точки зрения компилятора битовые поля структуры foo5 выглядят как двухбайтовые значения, из 16 бит которых используются только 12. Место после них заполняется так, чтобы размер структуры был кратен sizeof(short) — размеру наибольшего элемента.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct foo5 {
    short s; /* 2 байт */
    char c; /* 1 байт */
    int flip:1; /* всего 1 бит */
    int nybble:4; /* всего 5 бит */
    int septet:7; /* всего 12 бит */
    int pad1:4; /* всего 16 бит = 2 байт */
    char pad2; /* 1 байт */
};



Может быть вот так должно быть ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
struct foo5 {
    short s; /* 2 байт */
    char c; /* 1 байт */
    char pad0; /* 1 байт */
    int flip:1; /* всего 1 бит */
    int nybble:4; /* всего 5 бит */
    int septet:7; /* всего 12 бит */
    int pad1:4; /* всего 16 бит = 2 байт */
    char pad2; /* 1 байт */
};



Сейчас конечно потестирую, но по концевому заполнению пояснено недостаточно чётко
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882399
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct foo5 {
    short s; /* 2 байт */
    char c; /* 1 байт */
    char pad0; /* 1 байт */
    int flip:1; /* всего 1 бит */
    int nybble:4; /* всего 5 бит */
    int septet:7; /* всего 12 бит */
    int pad1:4; /* всего 16 бит = 2 байт */
};
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882402
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryWhite Owlпропущено...
Ты хочешь перегрузку функций в Си? Ну и запросто, объектное программирование никто не отменял.

Ниже код на С++, с использованием перегрузки функций

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
struct TreeNode* createTreeNode()
{
	struct TreeNode* tn = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	tn->w = NULL;
	tn->count = 0;
	tn->left = NULL;
	tn->right = NULL;
	return tn;
}

struct TreeNode* createTreeNode(const char* w)
{
	struct TreeNode* tn = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	tn->w = NULL;
	tn->w = (char*)malloc(sizeof(char)*(strlen(w)+1));
	strcpy(tn->w, w);
	tn->count = 1;
	tn->left = NULL;
	tn->right = NULL;
	return tn;
}



как вы предлагает сделать аналогичное на Си ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct TreeNode* createTreeNode(const char* w)
{
	struct TreeNode* tn = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	if(w) {
		tn->w = (char*)malloc(sizeof(char)*(strlen(w)+1));
		strcpy(tn->w, w);
		tn->count = 1;
	} else {
		tn->w = NULL;
		tn->count = 0;
	}
	tn->left = NULL;
	tn->right = NULL;
	return tn;
}

Правда сложно? Здесь никак не обойтись без перегруженных функций.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882413
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По 3 пункту вопрос снят, всё ок.

Мне кажется что с перегруженными функциями код выглядит логичнее. Вы усложнили алгоритм за счёт побочных операций, мне кажется, что это того не стоит. Хотя я конечно намного менее опытный, может быть позже соглашусь с такой точкой зрения
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882423
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПо 3 пункту вопрос снят, всё ок.

Мне кажется что с перегруженными функциями код выглядит логичнее. Вы усложнили алгоритм за счёт побочных операций, мне кажется, что это того не стоит. Хотя я конечно намного менее опытный, может быть позже соглашусь с такой точкой зрения
а кто тебе мешает написать функцию с другим именем?
Код: plaintext
1.
struct TreeNode* createTreeNodeEmpty()
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882429
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)SashaMercuryПо 3 пункту вопрос снят, всё ок.

Мне кажется что с перегруженными функциями код выглядит логичнее. Вы усложнили алгоритм за счёт побочных операций, мне кажется, что это того не стоит. Хотя я конечно намного менее опытный, может быть позже соглашусь с такой точкой зрения

а кто тебе мешает написать функцию с другим именем?
Код: plaintext
1.
struct TreeNode* createTreeNodeEmpty()



SSMasterZivпропущено...


странно, по-моему так достаточно очевидно:
-- для того, чтобы не думать очень долго над названием функции
-- для того, чтобы иметь возможность реализовывать user defined data types , встроенные в языке, и передумать для них разные операции.

Лично для меня, дело даже не в том чтобы подумать о названии функций, а в том, что на незачем создавать кучу функций с разными именами только из-за того, что у них разные параметры, поскольку смысловая нагрузка на функции сохраняется
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882430
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может кто-нибудь привести пример/частный случай, когда использование перегруженных функций хуже чем решения данного вопроса(примера) на языке Си (т.е. чем отсутствие перегрузки функций) ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882484
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlПравда сложно? Здесь никак не обойтись без перегруженных функций.и теперь ты должен знать реализацию твоей createTreeNode(const char* w). Ведь по декларации функции не понятно, можно ли туда передавать NULL, и что будет, если его туда передать. В случае перегрузки createTreeNode(); и createTreeNode( const char *w ); код самодокументирован. Если бы ещё не w, а имя осмысленное дать параметру, и элементу структуры...
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882490
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА может кто-нибудь привести пример/частный случай, когда использование перегруженных функций хуже чем решения данного вопроса(примера) на языке Си (т.е. чем отсутствие перегрузки функций) ?когда ты пишешь библиотеку на С++, которая использует С-интерфейс для экспортируемых функций ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882497
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tможет глобальнее поставить: зачем вообще нужна перегрузка операторов?
Лично мне интересно. Побаловался с этой темой тыкаясь в С++, но как-то не заценил.
Код: plaintext
1.
std::cout << "DimaT, правда ведь так удобней писать в консоль?" << std::endl;

;-))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882516
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
w-word
tn-TreeNode
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882517
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думал будет пример с арифметикой финансовых величин.

P.S. А так ведь букв меньше.

Код: plaintext
1.
printf("DimaT, правда ведь так удобней писать в консоль?\n");
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882521
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychDima Tможет глобальнее поставить: зачем вообще нужна перегрузка операторов?
Лично мне интересно. Побаловался с этой темой тыкаясь в С++, но как-то не заценил.
Код: plaintext
1.
std::cout << "DimaT, правда ведь так удобней писать в консоль?" << std::endl;

;-))
В фоксе еще удобнее:
Код: plaintext
1.
? "хочу тогда так писать"


:)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882536
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonP.S. А так ведь букв меньше.
Код: plaintext
1.
printf("DimaT, правда ведь так удобней писать в консоль?\n");


Так еще меньше и быстрее работает
Код: plaintext
1.
puts("DimaT, правда ведь так удобней писать в консоль?");
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882540
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ думал будет пример с арифметикой финансовых величин.
а я думал - комплексные числа - лучший кандидат
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882636
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилmaytonЯ думал будет пример с арифметикой финансовых величин.
а я думал - комплексные числа - лучший кандидат
Я вовсе не против комплексных чисел. Просто поток заказов на разработку денежных расчётов
встречается немного чаще IMHO.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882652
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМарк, а что не так в слове ЭВМ ? Или ВМ
Да нет ничего. Всё так. Можешь использовать. Просто оно (для меня)
характеризует конкретную эпоху развития ВТ. Как для историка - ренессанс.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882684
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПросто поток заказов на разработку денежных расчётов
встречается немного чаще IMHO.
Для денежных расчетов в СУБД есть типы MONEY или CURRENCY. В С++ ничего такого штатного нет?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882693
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonP.S. А так ведь букв меньше.
Код: plaintext
1.
printf("DimaT, правда ведь так удобней писать в консоль?\n");

Код: plaintext
1.
2.
3.
std::string users[] = { "mayton", "DimaT" };
std::cout << "ну " << users[ 0 ] << ", " << users[ 1 ] << ", ну вы чего? ";
std::cout << "Всё надо разжевать и довести до абсурда?" <<  std::endl;

хотел ещё константу PI в строку ввернуть, но сдержался ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882698
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилmaytonЯ думал будет пример с арифметикой финансовых величин.
а я думал - комплексные числа - лучший кандидатлучший кандидат - std::map::operator[], как ни крути. Тут уж примеры со всякими getValue() и т.п. точно рядом не стоят.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882736
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychmaytonP.S. А так ведь букв меньше.
Код: plaintext
1.
printf("DimaT, правда ведь так удобней писать в консоль?\n");

Код: plaintext
1.
2.
3.
std::string users[] = { "mayton", "DimaT" };
std::cout << "ну " << users[ 0 ] << ", " << users[ 1 ] << ", ну вы чего? ";
std::cout << "Всё надо разжевать и довести до абсурда?" <<  std::endl;

хотел ещё константу PI в строку ввернуть, но сдержался ))
Вот в этом месте я так понимаю константа Пи должна была просто меня
размазать по стенке.

Егорыч. Давай порассуждаем. Зачем нам вообще был предложен объект
cout и набор левых угловых скобочек? Какую задачу он решил?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882870
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЛично для меня, дело даже не в том чтобы подумать о названии функций, а в том, что на незачем создавать кучу функций с разными именами только из-за того, что у них разные параметры, поскольку смысловая нагрузка на функции сохраняется

Ну, если бы ты только знал, как много времени тратится в огромном проекте на С только на то, чтобы придумать название для новой функции, порой 90% времени, затраченного на патч, уходит только на это.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882912
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryкак вы предлагает сделать аналогичное на Си ?

Код: plaintext
1.
2.
struct TreeNode* createTreeNode();
struct TreeNode* createTreeNodeFromString(const char* w);



И таких XXXFromYYYY потом появляется с 10 штук, так что потом ещё приходится добавлять и

XXXFromYYYYWithZZZ
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882936
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

мне вот кажется, что нынешняя популярность всяческих замыканий связана с тем, что безымянным функциям по определению не нужно придумывать имя.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38882992
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot mayton]egorych
Код: plaintext
1.
2.
3.
std::string users[] = { "mayton", "DimaT" };
std::cout << "ну " << users[ 0 ] << ", " << users[ 1 ] << ", ну вы чего? ";
std::cout << "Всё надо разжевать и довести до абсурда?" <<  std::endl;

Егорыч. Давай порассуждаем. Зачем нам вообще был предложен объект
cout и набор левых угловых скобочек? Какую задачу он решил?ну вот тебе С-вариант, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
char users[2][] = { "mayton", "DimaT" };
printf( "ну " );
printf( "%s", users[ 0 ] );
printf( ", " );
printf( "%s", users[ 1 ] );
printf( ", ну вы чего? " );
printf( "Всё надо разжёвывать и довести до абсурда?" );

и где буковок меньше? ;-))
давайте только не будем представленную строку пытаться в один printf() зарядить, я знаю, что так можно, правда

По сути, перегрузка операторов и функций - это синтаксический сахар, позволяющий писать более читабельный код, тратя на него меньше усилий. По моему скромному мнению задача решена.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883024
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоесть если закрыть глаза на то что ты второй вариант написал в 7 строк то вобщем-то
и разницы нет никакой?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883076
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Разница большая. У printf есть неустранимый недостаток - там нужно указывать тип аргумента даже если компилятору он известен и для вывода значения не нужно ничего больше знать.
Код: plaintext
1.
2.
size_t i = 0;
printf("%???", i);


Я лично никак не могу запомнить какой формат у size_t.
Каждый раз гадаю. Хотя по большому счету он там не нужен вообще.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883080
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про то, что можно перепутать порядок форматов я вообще молчу ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883085
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПро то, что можно перепутать порядок форматов я вообще молчу ))
Некоторые компиляторы это проверяют.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883178
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSashaMercuryкак вы предлагает сделать аналогичное на Си ?

Код: plaintext
1.
2.
struct TreeNode* createTreeNode();
struct TreeNode* createTreeNodeFromString(const char* w);



И таких XXXFromYYYY потом появляется с 10 штук, так что потом ещё приходится добавлять и

XXXFromYYYYWithZZZВо первых, это не проблема. Те же glib/gtk живут и здравствуют.
Во вторых, если тебе так уж хочется жить с одной функцией, ну перейди в объектную модель. Не пользуйся POD переменными.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883212
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlесли тебе так уж хочется жить с одной функцией, ну перейди в объектную модель. Не пользуйся POD переменными.на С? можно примерчик?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883213
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТоесть если закрыть глаза на то что ты второй вариант написал в 7 строк то вобщем-то
и разницы нет никакой?ну нет и нет. Не пиши через <<, что я могу сказать ))))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883226
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolfMasterZiv,

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

Да, знаешь ли, там дофига чего ещё не надо, не только с именем проблема решается.
Нормальные замыкания -- это как ... ну не знаю... как свечка от гемороя, столько проблем сразу решает...
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883285
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychWhite Owlесли тебе так уж хочется жить с одной функцией, ну перейди в объектную модель. Не пользуйся POD переменными.на С? можно примерчик?
Код: 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.
typedef struct {
   unsigned int type;
} Object;

typedef struct {
  Object o;
  unsigned int capacity;
  char data[0];
} String;

typedef struct {
  Object o;
  unsigned int data;
} Int;

typedef union {
   String s;
   Int i;
} Variant;

void foo (Variant *v) {
   unsigned int type = *((int*)v);
   switch (type) {
   case INT: ....
   case STRING: ....
   default: fprintf(ERRLOG, "unknown type");
   }
}


На самом деле это очень удобно использовать и очень несложно надстраивать.
Из известных библиотек на этом принципе основаны Photon и IUP. Первое насквозь коммерческое (но писать под него сплошное удовольствие) а второе тут: http://iup.sourceforge.net/
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883291
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНа самом деле это очень удобно использовать и очень несложно надстраивать.
Из известных библиотек на этом принципе основаны Photon и IUP. Первое насквозь коммерческое (но писать под него сплошное удовольствие) а второе тут: http://iup.sourceforge.net/
Ну бдсм тоже для кого-то сплошное удовольствие ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883305
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite OwlНа самом деле это очень удобно использовать и очень несложно надстраивать.
Из известных библиотек на этом принципе основаны Photon и IUP. Первое насквозь коммерческое (но писать под него сплошное удовольствие) а второе тут: http://iup.sourceforge.net/
Ну бдсм тоже для кого-то сплошное удовольствие ))Да, да... мы уже знаем что ты не умеешь писать на Си.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883319
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlДа, да... мы уже знаем что ты не умеешь писать на Си.
Че это вдруг не умею? Умею. И даже пишу, когда нет возможности использовать С++ (на данный момент это только драйвера).
Просто не вижу смысла писать на С с момента появления в С++ некоторого набора фич, которые позволяют писать код принципиально качественнее и быстрее. А конкретнее - смарт-указатели и исключения. То, что в С в принципе невозможно реализовать и то, что сокращает и упрощает код в десятки раз.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883375
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНа самом деле это очень удобно использовать и очень несложно надстраивать.ты серьёзно? то есть, вместо
Код: plaintext
1.
2.
createNode();
createNode( const char * );

ты предлагаешь наплодить доп.структур и чудовищный switch? При том, что структуры тоже необходимо как то называть.
Трудно не согласиться с Анатолием ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883390
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С мне напоминает бюрократическое государство.
Где у государства есть полная инфа про граждан, но оно все равно на каждый чих требует от них всевозможные справки, которые оно же и выдает.
У некоторых граждан это создает иллюзию порядка и того что от этих справок что-то зависит
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883391
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite OwlДа, да... мы уже знаем что ты не умеешь писать на Си.
Че это вдруг не умею? Умею. И даже пишу, когда нет возможности использовать С++ (на данный момент это только драйвера).
Просто не вижу смысла писать на С с момента появления в С++ некоторого набора фич, которые позволяют писать код принципиально качественнее и быстрее. А конкретнее - смарт-указатели и исключения. То, что в С в принципе невозможно реализовать и то, что сокращает и упрощает код в десятки раз.Ну ты ж меня обвиняешь постоянно в неумении использовать С++... Вот наши неумения - явления одного порядка.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883397
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНу ты ж меня обвиняешь постоянно в неумении использовать С++... Вот наши неумения - явления одного порядка.
Отличие в том что мое мнение объективно основано на ваших ответах в темам по С++.
А ваше основано на обиде на мое мнение ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883405
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychWhite OwlНа самом деле это очень удобно использовать и очень несложно надстраивать.ты серьёзно?Да. Я серьезно.
По существу все GUI библиотеки под Си используют один из двух подходов. Либо заводят множество функций на каждый тип объекта (glib, gtk), либо идут по пути создания структур с типом структуры в качестве первого члена и switch по ним (iup, photon).
Попробовав оба, лично я предпочитаю второй (структуры и switch). Больше гибкости и намного проще в поддержке.

egorychты предлагаешь наплодить доп.структур и чудовищный switch? При том, что структуры тоже необходимо как то называть.Посмотри на С++. Когда ты создаешь библиотеку классов, ты занимаешься тем-же самым. На практике, если мы зададимся целью написать аналогичные библиотеки решающие одну и ту-же задачу (на Си и С++), то количество структур будет точно равняться количеству классов.
И switch будет совсем не чудовищный. При наследовании этот switch будет решать всего одно условие: это структура ребенок или нет? Если нет, то напрямую вызывать родительский метод. Да, это будет слегка медленнее чем подход с классами, потому что мы в рантайме будем определять какая именно это структура и какой из перегруженных методов надо вызывать, а с классами эти вопросы решатся еще на этапе компиляции.
Зато подход со структурами и switch позволяет добавлять и изменять "классы" прямо во время рантайма. Можно переопределять скины прямо во время работы. Плагины писать - не просто легко, а очень легко.

egorychТрудно не согласиться с Анатолием ))С ним легко не согласится. Достаточно просто на практике попробовать все парадигмы и увидеть их сильные и слабые стороны. А у Анатолия, к сожалению, нету широты взгляда.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883409
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlнету широты взгляда
Сказал человек который считает что исключения зло ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883418
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskymayton,

Разница большая. У printf есть неустранимый недостаток - там нужно указывать тип аргумента даже если компилятору он известен и для вывода значения не нужно ничего больше знать.
Код: plaintext
1.
2.
size_t i = 0;
printf("%???", i);


Я лично никак не могу запомнить какой формат у size_t.
Каждый раз гадаю. Хотя по большому счету он там не нужен вообще.
Та да. Пока С99 не добавил %z/%t, приходилось дефайнами разруливать.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883421
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
>>Да, я серьёзно
сознайся, ты специально делаешь вид, что наследование и перегрузка - это одно и то же, правда? )))
речь ведь шла о перегрузке функций вообще, и о перегрузке операторов, в частности )))

>>Зато подход со структурами и switch позволяет добавлять и изменять "классы" прямо во время рантайма. Можно переопределять скины прямо во время работы
ну да, шаблоны "Стратегия" и "Состояние", в плюсах их реализация выглядит красивее, потому что в нём есть встроенные средства для решения подобных вопросов, а в С приходится извращаться, как ты это не называй.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883423
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlДостаточно просто на практике попробовать все парадигмы и увидеть их сильные и слабые стороны.достаточно, действительно. Мой опыт мне говорит, что для объектной парадигмы лучше подходят языки, поддерживающие объектную парадигму )))
P.S. А то и Турбо-бэйсик можно языком системного программирования назвать, там ведь был доступ к прерываниям и прямой доступ в память ;-))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883429
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychWhite Owl,
>>Да, я серьёзно
сознайся, ты специально делаешь вид, что наследование и перегрузка - это одно и то же, правда? )))
речь ведь шла о перегрузке функций вообще, и о перегрузке операторов, в частности )))Нет, это конечно не одно и то же, но это очень родственные вещи. Любая перегрузка функций это по существу наследование от некоего общего предка, не всегда явно обозначенного. Понимание этого факта позволяет делать перегруженные функции практически в любом языке, а не только в тех которые явно имеют синтаксис перегрузки.
А что касается перегруженных операторов... Да, это в Си сделать не получится.

egorych>>Зато подход со структурами и switch позволяет добавлять и изменять "классы" прямо во время рантайма. Можно переопределять скины прямо во время работы
ну да, шаблоны "Стратегия" и "Состояние", в плюсах их реализация выглядит красивее, потому что в нём есть встроенные средства для решения подобных вопросов, а в С приходится извращаться, как ты это не называй.Расширенный синтаксис многое может сделать "красивее". Но дело то в том, что часто можно решить задачу и на более кратком синтаксисе. Получится не менее надежно и удобно, а красота это дело вкуса :)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883432
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
>>Понимание этого факта позволяет делать перегруженные функции практически в любом языке, а не только в тех которые явно имеют синтаксис перегрузки.
примерчик бы... твой пример про наследование не решает главной проблемы: отсутствия однотипных имён, о которых говорил MasterZiv, тебе всё одно придётся явно называть структуры, и вместо одной головной боли ты предлагаешь добавить сразу 7 )))

>>Расширенный синтаксис многое может сделать "красивее". Но дело то в том, что часто можно решить задачу и на более кратком синтаксисе. Получится не менее надежно и удобно, а красота это дело вкуса :)
не согласен, не получится "не менее надёжно и удобно". Не в "красоте" ведь дело. Если мне не надо изобретать из раза в раз таблицу виртуальных функций, то я, во первых, не ошибусь в её реализации, и, во вторых, мой код не будет загромождён ненужными рутинными подробностями, которые отлично может написать за меня компилятор.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883433
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychWhite OwlДостаточно просто на практике попробовать все парадигмы и увидеть их сильные и слабые стороны.достаточно, действительно. Мой опыт мне говорит, что для объектной парадигмы лучше подходят языки, поддерживающие объектную парадигму )))
Неверно. Опыт тебе должен говорить: Использовать объектную парадигму легче на языках поддерживающих объектный синтаксис.
А так, объектную парадигму можно применить практически к любому языку. Так же как и любую другую парадигму, к любому языку. В одних случаях это будет легче, в других сложнее, но .... парадигма это парадигма.


egorychP.S. А то и Турбо-бэйсик можно языком системного программирования назвать, там ведь был доступ к прерываниям и прямой доступ в память ;-))Это надо понимать что ты не видел системных программ написанных на Quick BASIC (который брат-близнец TB, но от Микрософта)?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883434
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЛюбая перегрузка функций это по существу наследование от некоего общего предка, не всегда явно обозначенного. Понимание этого факта позволяет делать перегруженные функции практически в любом языке, а не только в тех которые явно имеют синтаксис перегрузки.
А можно пример?
Вот код на С++:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void print(int v)
{
	printf("%i", v); 
}
void print(const char* v)
{
	printf("%s", v); 
}
int main()
{
	print(1);
	print("a");
	return 0;
}


Это перегрузка функции print двумя типами аргумента.
Как с помощью понимания того что перегрузка это "наследование от некоего общего предка" сделать такую перегруженную функцию не на любом языке, а хотя бы на С?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883437
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSashaMercuryкак вы предлагает сделать аналогичное на Си ?

Код: plaintext
1.
2.
struct TreeNode* createTreeNode();
struct TreeNode* createTreeNodeFromString(const char* w);



И таких XXXFromYYYY потом появляется с 10 штук, так что потом ещё приходится добавлять и

XXXFromYYYYWithZZZ

:D
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883438
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я плохо понял что предлагает сделать White Owl, возможно когда увижу ответ по примеру BS/Анатолия пойму.
Но как я понял предполагается добавление искусственных структур, и локальное усложнение программы. Потому вот такой вопрос.

Да, локально у нас что-то усложняется, но в цельной программе, насколько это будет органично ?
Отличаются ли способ Си, и перегрузка на С++ по части быстродействия ? Предполагаю, что на С++будет тратится время на выбор функций из всех возможных. На Си такого вроде-бы не должно возникать. Может быть ещё что-то не так.
И вот такой вопрос. Какие минусы при использовании перегрузки функций ?
Сколько функций максимум можно перегружать одним именем ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883439
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
>>Неверно. Опыт тебе должен говорить: Использовать объектную парадигму легче на языках поддерживающих объектный синтаксис.ну, это софистика уже пошла.
>>А так, объектную парадигму можно применить практически к любому языку.
эмулировать можно, где то лучше, где то хуже. Можно даже назвать это "я пишу в объектном стиле", а я это называю: "я умею строить вон какие крутые костыли"

>>Это надо понимать что ты не видел системных программ написанных на Quick BASIC
я и игры на бэйсике видел, не об этом ведь речь
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883440
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,
>>Предполагаю, что на С++будет тратится время на выбор функций из всех возможных.
с какой стати? внутреннее имя у каждой из этих функций - разное ведь. Об этом заботится компилятор, а не программист. В этом удобство то заключается.

>>Сколько функций максимум можно перегружать одним именем ?
до тех пор, пока не иссякнет фантазия в изобретении разных сигнатур для этого имени, то есть, теоретически, бесконечно ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883441
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryОтличаются ли способ Си, и перегрузка на С++ по части быстродействия ? Предполагаю, что на С++будет тратится время на выбор функций из всех возможных
Не отличается. Не будет.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883442
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНе отличается. Не будет.
Точнее, тот костыль, который приведет White Owl, он конечно будет отличаться от С++ по скорости. В худшую сторону ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883443
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychWhite Owl,
>>Понимание этого факта позволяет делать перегруженные функции практически в любом языке, а не только в тех которые явно имеют синтаксис перегрузки.
примерчик бы... твой пример про наследование не решает главной проблемы: отсутствия однотипных имён, о которых говорил MasterZiv, тебе всё одно придётся явно называть структуры, и вместо одной головной боли ты предлагаешь добавить сразу 7 )))
Почему не решает? Очень даже решает. Просто расширь пример из 17283801 до полноценного наследования, добавь в нужные структуры указатели на функции и получишь почти полную копию С++.
Посмотри на IUP хотя бы. Там есть практически один единственный тип данных IupHandle*. Конкретные объекты создаются через IupFrame(), IupButton(), IupMenu(), etc. А дальше опять одна единственная функция IupSetAttribute(IupHandle*, ....);
И вся палитра виджетов покрывается этим набором.

egorych>>Расширенный синтаксис многое может сделать "красивее". Но дело то в том, что часто можно решить задачу и на более кратком синтаксисе. Получится не менее надежно и удобно, а красота это дело вкуса :)
не согласен, не получится "не менее надёжно и удобно". Не в "красоте" ведь дело. Если мне не надо изобретать из раза в раз таблицу виртуальных функций, то я, во первых, не ошибусь в её реализации, и, во вторых, мой код не будет загромождён ненужными рутинными подробностями, которые отлично может написать за меня компилятор.Тоже не совсем верно.
Ты будешь делать таблицу функций только на "своем" уровне. Не забывай про наследование.
Да, в С++ за тебя это компилятор сделает, а в Си надо будет в конструкторе самостоятельно наполнить эту таблицу. Но это единственная сложность.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883444
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite OwlЛюбая перегрузка функций это по существу наследование от некоего общего предка, не всегда явно обозначенного. Понимание этого факта позволяет делать перегруженные функции практически в любом языке, а не только в тех которые явно имеют синтаксис перегрузки.
А можно пример?
Вот код на С++:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void print(int v)
{
	printf("%i", v); 
}
void print(const char* v)
{
	printf("%s", v); 
}
int main()
{
	print(1);
	print("a");
	return 0;
}


Это перегрузка функции print двумя типами аргумента.
Как с помощью понимания того что перегрузка это "наследование от некоего общего предка" сделать такую перегруженную функцию не на любом языке, а хотя бы на С? 17283801
В данном случае общий предок это "некая переменная". Ну вот и сделай себе абстрактную переменную. Это будет конечно чуть сложнее чем с POD типами, но не намного.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883445
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, BS на 192 странице (7.4) говорит о том что происходит некий процесс поиска подходящей функции. Да и это логично
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883446
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlТам есть практически один единственный тип данных IupHandle*. Конкретные объекты создаются через IupFrame(), IupButton(), IupMenu(), etc. А дальше опять одна единственная функция IupSetAttribute(IupHandle*, ....);так и вижу, как я пишу функции вида: IupEmptyFrame(), IupFrameWithHeader(), IupFrameWithDoubleBorder(), IupFrameWithHeaderAndDoubleBorder()...
потому что это понятней всё же, чем
Код: plaintext
1.
2.
3.
4.
5.
IupHandle *frm = IupFrame();
IupSetAttribute( frm, "Header", NULL );
IupSetAttribute( frm, "Border", "Double" );
...
IupSetAttribute( frm, "BorderColor", "Red" );

разбросанные по всему коду ровным слоем. Бррр! ))))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883447
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВ данном случае общий предок это "некая переменная". Ну вот и сделай себе абстрактную переменную. Это будет конечно чуть сложнее чем с POD типами, но не намного.
А можете привести код вызывающий такую функцию с двумя разными типами, чтобы мы увидели насколько это "не намного сложнее", когда вместо передачи числа или строки создается, а после вызова удаляется объект?

Также не совсем понятно как перегрузка разным количеством аргументов реализуется с помощь. наследования.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883448
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychWhite Owl,
>>Неверно. Опыт тебе должен говорить: Использовать объектную парадигму легче на языках поддерживающих объектный синтаксис.
ну, это софистика уже пошла.А вот тут я бы тебе предложил заглянуть в словарь, с целью узнать значение слова "софизм".
А вот то что ты допустил паралогизм играясь с тавтологией это без сомнения.

egorych>>А так, объектную парадигму можно применить практически к любому языку.
эмулировать можно, где то лучше, где то хуже. Можно даже назвать это "я пишу в объектном стиле", а я это называю: "я умею строить вон какие крутые костыли" И? Одно другому не мешает.
Вопрос же был: возможно ли это? Ответ: да возможно.
И эти костыли не такие уж крутые. Ты бы посмотрел как объектность достигается в Rexx, особенно как это внутри организовано... Вот там это действительно восхищение вызывает!

egorych>>Это надо понимать что ты не видел системных программ написанных на Quick BASIC
я и игры на бэйсике видел, не об этом ведь речьПовторюсь:
Вопрос же был: возможно ли это? Ответ: да возможно.
Так что да, Turbo Basic это тоже язык системного программирования. Если из ЯП можно добраться до функций ОС - это язык годный для системного программирования.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883449
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСтранно, BS на 192 странице (7.4) говорит о том что происходит некий процесс поиска подходящей функции. Да и это логично
Да при компиляции происходит поиск имен.
Это занимает микросекунды. Т.е. по сути не влияет на скорость компиляции.
При связывании скорость поиска не зависит от перегрузки, т.к. каждая перегрузка дает отдельное имя.
А при выполнении имен вообще нет, есть только адреса, которые вообще не надо искать.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883450
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryСтранно, BS на 192 странице (7.4) говорит о том что происходит некий процесс поиска подходящей функции. Да и это логично
Да при компиляции происходит поиск имен.
Это занимает микросекунды. Т.е. по сути не влияет на скорость компиляции.
При связывании скорость поиска не зависит от перегрузки, т.к. каждая перегрузка дает отдельное имя.
А при выполнении имен вообще нет, есть только адреса, которые вообще не надо искать.

а, в С++ статическая типизация как и в Си, верно ?) Т.е. это влияет только на скорость компиляции
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883452
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite OwlВ данном случае общий предок это "некая переменная". Ну вот и сделай себе абстрактную переменную. Это будет конечно чуть сложнее чем с POD типами, но не намного.
А можете привести код вызывающий такую функцию с двумя разными типами, чтобы мы увидели насколько это "не намного сложнее", когда вместо передачи числа или строки создается, а после вызова удаляется объект?Мне уже лень писать очевидный код.
Повторяю ссылку: http://iup.sourceforge.net/
Библиотека построенная именно по принципу наследования структур. Там есть и примеры, и исходники и все что угодно. И она уже вылизанная и без синтаксических ошибок. А то знаю я вас, опечатаюсь где-нибудь, а в ответ сразу прилетит: "Этот метод не работает!"

Anatoly MoskovskyТакже не совсем понятно как перегрузка разным количеством аргументов реализуется с помощь. наследования.Через эллипсис конечно.
Да, ошибки компилятор не отловит, но в рантайме можно все очень просто сделать.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883453
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychWhite OwlТам есть практически один единственный тип данных IupHandle*. Конкретные объекты создаются через IupFrame(), IupButton(), IupMenu(), etc. А дальше опять одна единственная функция IupSetAttribute(IupHandle*, ....);так и вижу, как я пишу функции вида: IupEmptyFrame(), IupFrameWithHeader(), IupFrameWithDoubleBorder(), IupFrameWithHeaderAndDoubleBorder()...
потому что это понятней всё же, чем
Код: plaintext
1.
2.
3.
4.
5.
IupHandle *frm = IupFrame();
IupSetAttribute( frm, "Header", NULL );
IupSetAttribute( frm, "Border", "Double" );
...
IupSetAttribute( frm, "BorderColor", "Red" );

разбросанные по всему коду ровным слоем. Бррр! ))))То есть тебе больше по душе метод примененный в GLIB/GTK+? Ну Ок. Называется от чего ушли, к тому пришли :)
Но эта парадигма тоже вполне рабочая и прекрасно живущая.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883454
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЧерез эллипсис конечно.
Да, ошибки компилятор не отловит, но в рантайме можно все очень просто сделать.
И передавать число аргументов? Без этого ... не работает.

Я правильно понимаю? Чтобы на С писать программы с уровнем абстракции выше ассемблера, надо реализовать в проекте свой вариант эмуляции динамической типизации.
Так а зачем нужен С тогда? Пишите сразу на Перле или Питоне каком-нибудь - там все это готовое уже, и скорость будет такая же, если не лучше.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883458
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощение, у меня тут возник вопрос по теме топика. Написал программу (взял у K&R) собирающую все слова в файле с подсчётом появлений. Использую бинарное дерево

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct TreeNode
{
	char* w;
	int count;
	struct TreeNode* left;
	struct TreeNode* right;
};



И такие функции:

Код: 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.
struct TreeNode* createTreeNode()
{
	struct TreeNode* tn = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	tn->w = NULL;
	tn->count = 0;
	tn->left = tn->right = NULL;
	return tn;
}

struct TreeNode* createTreeNode(const char* w)
{
	struct TreeNode* tn = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	tn->w = NULL;
	tn->w = (char*)malloc(sizeof(char)*(strlen(w)+1));
	strcpy(tn->w, w);
	tn->count = 1;
	tn->left = tn->right = NULL;
	return tn;
}

struct TreeNode* retree(struct TreeNode* root, const char* w)
{
	if (root == NULL){
		struct TreeNode* new_root = createTreeNode(w);
	}
	else{
		int cond = strcmp(root->w, w);
		if (cond > 0){
			root->left = retree(root->left, w);
		}
		else if (cond > 0){
			root->right = retree(root->right, w);
		}
		else{
			root->count += 1;
		}
	}
	return root;
}

void printTreeNodes(struct TreeNode* root)
{
	if (root != NULL)
	{
		printTreeNodes(root->left);
		printf("%4i %s\n", root->count, root->w);
		printTreeNodes(root->right);
	}
}



Такой код обрабатывает файл

Код: plaintext
1.
2.
3.
4.
5.
6.
	char* id = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
	while ((t = get_identifier(id, in)) != EOF)
	{
		//printf("%s\n", id);
		root = retree(root, id);
	}



Функций retree мне не нравится, думаю что проблема в ней. Но она приведена у K&R, потому возможно с ней всё в порядке. Подскажите пожалуйста, в чём я ошибаюсь ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883460
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё у меня вопрос по соседнему топику, но там я не могу отправить сообщение. Не знаю почему.

Объекты объявленные в теле цикла являются автоматическими, это так. И потому они действительно должны автоматически уничтожиться, не вызывая утечек.

Но как это должно наверняка происходить в цикле ? 1. Либо, как говорит Анатолий (возможно это соответствует стандарту), на каждой итерации цикла будет создаваться новый объект, путь даже по тому-же адресу 2. Либо объект будет создан один раз, и уничтожится после завершения всех итераций цикла (о чём говорил Дмитрий, и что логичнее).
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883473
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
struct TreeNode* retree(struct TreeNode* root, const char* w)
{
	if (root == NULL){
		struct TreeNode* new_root = createTreeNode(w);
                return new_root;
	}
	else{
		int cond = strcmp(root->w, w);
		if (cond > 0){
			root->left = retree(root->left, w);
		}
		else if (cond > 0){
			root->right = retree(root->right, w);
		}
		else{
			root->count += 1;
		}
               return root;
	}
	
}
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883480
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Заработало, не заметил. Спасибо )
Только так исправил

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
struct TreeNode* retree(struct TreeNode* root, const char* w)
{
	if (root == NULL){
		root = createTreeNode(w);
	}
	else{
		int cond = strcmp(root->w, w);
		if (cond > 0){
			root->left = retree(root->left, w);
		}
		else if (cond < 0){
			root->right = retree(root->right, w);
		}
		else{
			root->count += 1;
		}
	}
	return root;
}
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883549
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

>>Вопрос же был: возможно ли это? Ответ: да возможно.
так с этим то как раз никто не спорит. С помощью волшебных костылей можно всё. Спор ведётся о том, нужно ли :) Ведь есть инструмент, который позволяет обсуждаемое из-коробки, так зачем нужны все эти извращения? Вот чего я понять до сих пор не могу ))

>>То есть тебе больше по душе метод примененный в GLIB/GTK+?
мне по душе метод, применённый в С++. Хочешь писать в объектном стиле - бери язык с поддержкой ООП :)
>>Называется от чего ушли, к тому пришли :)
это называется, что так и не ушли, а просто переместили проблему уровнем выше, ничего, по сути, не решив :)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883900
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я читал... думал... снова читал.

Слушайте... а почему вы сравниваете два абсолютно разных языка? Вы бы ещё Дельфи с Питоном сравнивали.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883941
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jmp_originalСлушайте... а почему вы сравниваете два абсолютно разных языка?
Какие же они разные, если все вот эти С-шные костыли можно просто взять и не меняя ни строчки кода использовать в С++ коде (ну предположим что найдутся извращенцы, которые имея С++ буду писать на нем в стиле С) ? :)

jmp_originalВы бы ещё Дельфи с Питоном сравнивали.
А тут - да. Несравнимо. Дельфи-то вообще не язык )))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883956
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

1) Можно. Даже, наверное, находятся. Только это всё равно будет PureC, а не.

2) Хорошо, Паскаль.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883966
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jmp_original2) Хорошо, Паскаль.
Я другое имел в виду когда говорил "не язык"
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38883981
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЯ другое имел в виду когда говорил "не язык" как там было о снобизме?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884064
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychкак там было о снобизме?
Одно дело, когда отвечаешь на чистый флейм, другое дело когда на полном серьезе даются советы ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884216
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyjmp_originalСлушайте... а почему вы сравниваете два абсолютно разных языка?
Какие же они разные, если все вот эти С-шные костыли можно просто взять и не меняя ни строчки кода использовать в С++ коде (ну предположим что найдутся извращенцы, которые имея С++ буду писать на нем в стиле С) ? :)
Возможно ноги растут от интеграции другими средами или рантаймами или технологиями.
Обычно С-исходник проще вызывается из через JNI, Remoting. Или прочие техники
маршалинга-сериализации.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884273
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОбычно С-исходник проще вызывается из через JNI, Remoting. Или прочие техники
маршалинга-сериализации.
Проще чем что?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884345
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Толик не придирайся. Ты прекрасно понял чем что.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884347
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЯ правильно понимаю? Чтобы на С писать программы с уровнем абстракции выше ассемблера, надо реализовать в проекте свой вариант эмуляции динамической типизации.Не передергивай.
Можно писать ОО на Си даже со статической типизацией, но вот ее уже надо будет делать вручную. Она конечно будет потом оптимизирована вплоть до отсутствия кода, но в исходнике ее надо будет самому писать. Пример: GTK+ с его функциями вида GTK_WIDGET().
С динамической типизацией проще.

egorych>>Вопрос же был: возможно ли это? Ответ: да возможно.
так с этим то как раз никто не спорит. С помощью волшебных костылей можно всё. Спор ведётся о том, нужно ли :) Ведь есть инструмент, который позволяет обсуждаемое из-коробки, так зачем нужны все эти извращения? Вот чего я понять до сих пор не могу ))Нет. О том "нужно оно или нет" вопрос в этом топике, вплоть до поста на который я сейчас отвечаю, еще не поднимался.

Anatoly MoskovskymaytonОбычно С-исходник проще вызывается из через JNI, Remoting. Или прочие техники
маршалинга-сериализации.
Проще чем что?
Проще чем всё.
Межязыковое взаимодействие с Си намного проще чем с любым другим языком. За исключением ассемблера конечно.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884355
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТолик не придирайся. Ты прекрасно понял чем что.
White OwlПроще чем всё.
Межязыковое взаимодействие с Си намного проще чем с любым другим языком. За исключением ассемблера конечно.
Ну видите. Далеко не всем понятно, не только проще чем что, но и вообще что проще.
Мне например совершенно не понятно проще чем что JNI, которое является одной из самых технически сложных для применения технологий межъязыкового взаимодействия.
И уж точно не проще прямого С-шного синтаксиса при вызове внешних библиотек.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884377
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskymaytonТолик не придирайся. Ты прекрасно понял чем что.
White OwlПроще чем всё.
Межязыковое взаимодействие с Си намного проще чем с любым другим языком. За исключением ассемблера конечно.
Ну видите. Далеко не всем понятно, не только проще чем что, но и вообще что проще.
Мне например совершенно не понятно проще чем что JNI, которое является одной из самых технически сложных для применения технологий межъязыкового взаимодействия.
И уж точно не проще прямого С-шного синтаксиса при вызове внешних библиотек.И с чем ты тут не согласен? JNI это протокол взаимодействия Java с внешними (не Java) модулями.
JNI не прост, согласен. Но JNI поверх Си проще чем JNI поверх С++. Но кроме Си и С++, через JNI можно вызывать процедуру вообще на любом языке. Это будет намного сложнее, и часто "да проще повесится", но это возможно.
И это относится не только к Java c JNI, но и к любому другому языку.
А так как люди обычно идут по пути наименьшего сопротивления, то они и берут Си, если в дальнейшем потребуется связывать свои модули с чужими.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884384
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlО том "нужно оно или нет" вопрос в этом топике, вплоть до поста на который я сейчас отвечаю, еще не поднимался.подразумевался, я думал, это понятно, но оказался невнятен, прошу прощения ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884396
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНо JNI поверх Си проще чем JNI поверх С++
Т.е. речь шла не про JNI а про то что JNI+C против JNI+C++?
С этим я согласен, что JNI+C++ немного сложнее, за счет того что нельзя сгенерить декларации native сразу в С++ стиле, и приходится делать С-шные обертки над С++ кодом.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884409
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyЯ другое имел в виду когда говорил "не язык"
Там нет тернарного оператора? )))

Не, не, я знаю, знаю! Там нельзя написать A = B = C
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884416
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jmp_original, залогонься товарищ! Будь джентльменом!
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884759
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, чес слово, мне лень восстанавливать пароль (я его потом снова забуду). Тем более что последний раз я писал зарегенным года 4 назад.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884833
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jmp_originalя его потом снова забудусдаю лучший пароль в мире: "777", очень сложно забывается
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38884841
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychсдаю лучший пароль в мире: "777", очень сложно забывается
не, лучше Pa$$w0rd один раз запомнил и можно пользоваться даже там где админы маньяки
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38885352
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это мысль. Pa$$w0rd может быть получен через pwdgen 8 + несоколько фильтров.

1) Uppercase для (1) символа.
2) Замена "s"=>"$"
3) Замена "o"=>"0"

сюда же до кучи можно добавить опциональные замены "a"=>"@" и прочие популярные хитрости.

Подумаю вечером.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38885356
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто мысль. Pa$$w0rd может быть получен через pwdgen 8 + несоколько фильтров.

1) Uppercase для (1) символа.
2) Замена "s"=>"$"
3) Замена "o"=>"0"

сюда же до кучи можно добавить опциональные замены "a"=>"@" и прочие популярные хитрости.

Подумаю вечером.и "Р" ещё можно русскую подставить, или "а" ;)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38885371
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... русскую Р при вводе пассворда вряд-ли будут переключать.
Чисто технически к примеру при входе в BIOS или HDD под Cryptix
у вас нет доступа к национальным кодировкам.

А вот замена на созвучные или на ассоциативные буквы - это мысль.

Причём генерация значительно проще.

Код: plaintext
1.
2.
3.
4.
5.
6.
password
Password
pa$$word
pa$$word
pa$$w0rd
Pa$$w0rd
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38885443
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто мысль. Pa$$w0rd может быть получен через pwdgen 8 + несоколько фильтров.
Не в ту сторону думаешь. Это пароль для злобного админа ресурса где лично мне терять нечего, я как пользователь делать ничего не могу, но от меня требуют чтобы в пароле были большие и маленькие буквы, цифры и небуквенные символы в общем количестве не менее 8 штук.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38885539
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и тут свой генератор вспомнил :D
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38890143
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlegorychа я правильно понимаю, что таковую структуру на стеке не разместишь?Почему же не разместишь? Запросто. только не забывай что sizeof(struct temp) == sizeof(T0)+sizeof(T1);

То есть вполне можно сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct temp
{
    T0 count;
    T1 smth_else;
    T2 will_allocate_memory[0];
}

void foo() {
   struct temp t;

   t.count = 123;  /// Ok
   t.smth_else = some_data; /// Ok
   t.will_allocate_memory[0] /// error
} array[]={...}; //цитирование изменено в этой строчке



А можно ли определить количество элементов в массиве из таких структур ? Правильно ли я понимаю что нельзя ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38890153
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА можно ли определить количество элементов в массиве из таких структур ? Правильно ли я понимаю что нельзя ?Это обычный динамический массив, только дополненный спереди какими-то полями с жестко заданным размером.
Так что и ответ на вопрос "сколько мы там памяти под это выделили?" делается точно так же как и с обычным выделением на куче.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38993269
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Какую, на ваш взгляд, структуру данных лучше всего использовать для CRUD операций с лексемами при лексическом анализе кода на языке Си?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38993278
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryдля CRUD операций с лексемами при лексическом анализе кода на языке Си?
Тут нужно ТЗ писать страниц на 10. Или думаешь все твои мысли читают?

Что за ГРУД-операции с лексемами? Ни пса нипонять.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38993288
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь имеется ввиду что данная структура данных должна быть удобна для чтения лексем, добавления в облако лексем, удаления из этой структуры, и изменения (изменение потребуется в будущем). Здесь использовал термин СУБД (create read update delete)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38993297
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдесь имеется ввиду что данная структура данных должна быть удобна для чтения лексем, добавления в облако лексем, удаления из этой структуры, и изменения (изменение потребуется в будущем). Здесь использовал термин СУБД (create read update delete)
Может СУБД использовать? sqlite например.
Или почитай как в SQL серверах хранение данных организовано. В книжках про MSSQL (возможно по другим тоже) обычно подробно расписывают как данные физически хранятся и как к ним доступ происходит.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38993372
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.
Какую, на ваш взгляд, структуру данных лучше всего использовать для CRUD операций с лексемами при лексическом анализе кода на языке Си?лучше всего использовать ту структуру, которая лучше всего подходит для решения задачи ;)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38993816
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
при чём тут СУБД ? Я просто пояснил по термину CRUD.
Мне кажется что лучше использовать дерево
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38993921
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDima T,
при чём тут СУБД ? Я просто пояснил по термину CRUD.
Я к тому что хранение данных в СУБД заточено на то чтобы CRUD работал быстро. Там в т.ч. и деревья используются.
Основная проблема будет в использовании памяти, борьба с тормозами из-за выделения/перевыделения.

В STL есть <map> и <set> может они подойдут.

По-хорошему
maytonТут нужно ТЗ писать страниц на 10. Или думаешь все твои мысли читают?
накидай хотя бы мини ТЗ, а то смутно представляется что ты там изобретаешь и для чего.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #38994117
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдесь имеется ввиду что данная структура данных должна быть удобна для чтения лексем, добавления в облако лексем, удаления из этой структуры, и изменения (изменение потребуется в будущем). Здесь использовал термин СУБД (create read update delete)
Сколько штук лексем предполагается хранить?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014164
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryЗдесь имеется ввиду что данная структура данных должна быть удобна для чтения лексем, добавления в облако лексем, удаления из этой структуры, и изменения (изменение потребуется в будущем). Здесь использовал термин СУБД (create read update delete)
Сколько штук лексем предполагается хранить?

Здравствуйте. Столько, сколько лексем в одной среднестатистической программе. Я не знаю ответ на этот вопрос, но полагаю порядка 10^7 лексем
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014173
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
У меня попутно возник вопрос по графам (предыдущий вопрос не закрыт, вернусь к нему позже).
Диомидис Спинеллис пишет о том, что вершины графа есть смысл хранить в двусвязном списке. Вы делаете так-же? Список, как я пронимаю, требуется в случае динамического добавления узлов графа(иначе он тут, по-моему, не нужен). Почему интерфейс структуры содержит указатель на поле n_next предыдущего узла, а не адрес предыдущего узла ? Почему имя этого узла имеет тип данных массив char мощностью 1, а не символьный тип ? Мне почему-то не очень нравится эта реализация. Есть ли оптимальная реализация? Если это возможно, приведите пример того, как вы реализовывали(в своих программах) интерфейс для графа или как бы вы его реализовали.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014197
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПочему имя этого узла имеет тип данных массив char мощностью 1, а не символьный тип?глубоко не вчитывался в текст, но, наверное, тут имеется ввиду этот кейс: 17247709
кстати, в С нет символьного типа, если вдруг чё ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014202
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryПочему имя этого узла имеет тип данных массив char мощностью 1, а не символьный тип?глубоко не вчитывался в текст, но, наверное, тут имеется ввиду этот кейс: 17247709
кстати, в С нет символьного типа, если вдруг чё ))

ISO/IEC 9899:201x
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014203
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, я не хотел смеющийся смайл, это были глаза и три улыбки
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014204
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, вероятно так. Спасибо :) Я про это забыл, тогда лучше бы сделали char name[0], было бы проще понять
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014330
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДа, вероятно так. Спасибо :) Я про это забыл, тогда лучше бы сделали char name[0], было бы проще понятьвероятно, на момент написания книги конструкции char name[0] не было в стандарте, или в компиляторе, которым пользовался автор
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014332
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryISO/IEC 9899:201xcalled то они called, но по сути это целые между short и int.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014647
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryISO/IEC 9899:201xcalled то они called, но по сути это целые между short и int.

целые, конечно. Вот рисунок согласно стандарту
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014724
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryцелые, конечно.значит - нет символьного типа в С ;-))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014757
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryцелые, конечно.значит - нет символьного типа в С ;-))

согласно стандарту есть: ))) Число 3 натуральное, но кроме-того оно простое, и целое )
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014792
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На этом вырвиглазном рисунке float отмечен как object type. Это чё вообще за хрено-канитель такая.
Пионеры почитают твой рисунок и поверят в него как в луркмоар или википедию и пойдут блджад
сдавать лабу.

И тут-то к ним подкрадётся белая полярная лиса...
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014829
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.
У меня попутно возник вопрос по графам (предыдущий вопрос не закрыт, вернусь к нему позже).
Диомидис Спинеллис пишет о том, что вершины графа есть смысл хранить в двусвязном списке. Вы делаете так-же?
Свойство графа номер 1: у графа есть некоторое количество (от нуля до бесконечности) вершин.
Свойство графа номер 2: каждая вершина графа может иметь от нуля до бесконечности связей с любой другой вершиной (включая саму себя).
Свойство графа номер 3: каждая связь имеет строго два конца прикрепленных к вершинам. Связь может быть ненаправленной, одно- или дву-направленной.

Спрашивается: какая структура данных может хранить граф?

Саша, перестань читать странные книжки, начни думать.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014834
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДиомидис Спинеллис пишет о том, что вершины графа есть смысл хранить в
двусвязном списке.
Вершины графа не имеет смысла хранить вообще, поскольку у них обычно нет аттрибутов кроме
номера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014836
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSashaMercuryДиомидис Спинеллис пишет о том, что вершины графа есть смысл хранить в
двусвязном списке.
Вершины графа не имеет смысла хранить вообще, поскольку у них обычно нет аттрибутов кроме
номера.
Читай учебник.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014919
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryсогласно стандарту есть: ))) Число 3 натуральное, но кроме того оно простое, и целое )но не символ. Другое дело, что есть символы, которыми можно написать число 3, но ни один из них невозможно хранить в типе char, хоть signed, хоть unsigned ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014994
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНа этом вырвиглазном рисунке float отмечен как object type. Это чё вообще за хрено-канитель такая.
Пионеры почитают твой рисунок и поверят в него как в луркмоар или википедию и пойдут блджад
сдавать лабу.

И тут-то к ним подкрадётся белая полярная лиса...

тот рисунок практически(по причине вашего замечания) полностью соответствует стандарту. В скобках написано basic. Выше видимо не дописал, должно быть complete object types. Хотя правильно наоборот. basic types (complete object types)

Спасибо что заметили C:
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014995
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что за белая полярная лиса ? Это откуда ?)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014997
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlSashaMercuryЗдравствуйте.
У меня попутно возник вопрос по графам (предыдущий вопрос не закрыт, вернусь к нему позже).
Диомидис Спинеллис пишет о том, что вершины графа есть смысл хранить в двусвязном списке. Вы делаете так-же?
Свойство графа номер 1: у графа есть некоторое количество (от нуля до бесконечности) вершин.
Свойство графа номер 2: каждая вершина графа может иметь от нуля до бесконечности связей с любой другой вершиной (включая саму себя).
Свойство графа номер 3: каждая связь имеет строго два конца прикрепленных к вершинам. Связь может быть ненаправленной, одно- или дву-направленной.

Спрашивается: какая структура данных может хранить граф?

Саша, перестань читать странные книжки, начни думать.

Вы исходите из свойств графа, но у меня в голове преобладают задачи.
0. Вершина графа должна хранить не только уникальное поле, но и другие аттрибуты
1. Необходимо за минимальное время добавлять новую вершину графа
2. Необходимо за минимальное время получать информацию о любой вершине графа
3. Необходимо за минимальное время добавить новую связь в графе
4. Необходимо за минимальное время получить множество вершин с которыми данная вершина имеет связь и узнать информацию о этой связи(длина, время)
5. Не знаю есть ли смысл быстро удалять вершины и связи


Мне хочется хранить весь граф в одном 'облаке'. Это интуитивное определение. Но чтобы это облако реализовать, исходя из свойств и задач для графа, требуется список вершин (двусвязный), и какая-то динамическая, удобная по скорости(но не факт что в реализации и в использовании), структура для списка ребер
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39014998
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати.
Расскажите пожалуйста как вы используете графы в своей жизни(т.е. в каких задачах они встречались у вас ). У меня в голове крутится только задача Коммивояжера .
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39015217
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryРасскажите пожалуйста как вы используете графы в своей жизни(т.е. в
каких задачах они встречались у вас ). У меня в голове крутится только задача Коммивояжера
..
Игровое ИИ. Нахождение кратчайшего пути из точки А в точку Б на карте произвольной сложности.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39015310
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSashaMercuryРасскажите пожалуйста как вы используете графы в своей жизни(т.е. в
каких задачах они встречались у вас ). У меня в голове крутится только задача Коммивояжера
..
Игровое ИИ. Нахождение кратчайшего пути из точки А в точку Б на карте произвольной сложности.

Как там щас наверху (в игровом мире) ? Я думал бьют на кубики и ищут "волной". Не?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39015313
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА что за белая полярная лиса ? Это откуда ?)

Белая полярная лиса.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39015708
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВы исходите из свойств графа, но у меня в голове преобладают задачи.Обрати внимание на эти свои слова. У нас с тобой разные цели. У кого-то другого будет третья цель... и так далее. Вывод? Структура хранения графа которую выберу я не обязательно будет совпадать со структурой которую выберешь и ты, и со структурой которую выбрал автор книги которая тебя смутила. При этом все три структуры будет абсолютно правильными потому что будут преследовать разные цели.

SashaMercuryисходя из свойств и задач для графа, требуется список вершин (двусвязный), и какая-то динамическая, удобная по скорости(но не факт что в реализации и в использовании), структура для списка реберНу и? Ты уже ответил на 60% вопроса. Ты уже догадался что вершины и ребра удобно хранить по отдельности. И уже знаешь как будешь хранить вершины. Теперь еще придумай как хранить ребра и вся задача будет решена.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034453
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

нашёл интересный сайтик Algorithms and Data Structures
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034661
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlSashaMercuryВы исходите из свойств графа, но у меня в голове преобладают задачи.Обрати внимание на эти свои слова. У нас с тобой разные цели. У кого-то другого будет третья цель... и так далее. Вывод? Структура хранения графа которую выберу я не обязательно будет совпадать со структурой которую выберешь и ты, и со структурой которую выбрал автор книги которая тебя смутила. При этом все три структуры будет абсолютно правильными потому что будут преследовать разные цели.

SashaMercuryисходя из свойств и задач для графа, требуется список вершин (двусвязный), и какая-то динамическая, удобная по скорости(но не факт что в реализации и в использовании), структура для списка реберНу и? Ты уже ответил на 60% вопроса. Ты уже догадался что вершины и ребра удобно хранить по отдельности. И уже знаешь как будешь хранить вершины. Теперь еще придумай как хранить ребра и вся задача будет решена.

Такое решение мне не нравилось(но я остановился на нём). Проблема с графами решена, спасибо :)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034662
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)SashaMercury,

нашёл интересный сайтик Algorithms and Data Structures

Спасибо. Но это ведь Java
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034663
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurykealon(Ruslan)SashaMercury,

нашёл интересный сайтик Algorithms and Data Structures

Спасибо. Но это ведь JavaИ что? Ты думаешь принципы хранения данных в разных языках отличаются?
Уже который раз я тебе повторяю: Саша, возьмись за другие языки.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034664
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlSashaMercuryпропущено...


Спасибо. Но это ведь JavaИ что? Ты думаешь принципы хранения данных в разных языках отличаются?
Уже который раз я тебе повторяю: Саша, возьмись за другие языки.

нет, я думаю что Java это прежде всего объектно-ориентированный язык программирования, для работы программы на Java требуется виртуальная машина, что влияет на скорость программ написанных на данном языке, и на требования к ресурсам. Потому мне не интересно глубоко изучать этот язык. Может быть я с ним ознакомлюсь, когда будет время. Сейчас занимаюсь C++, это ведь другой язык, и самое главное, другая парадигма
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034665
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl, и большое спасибо что советуете. Я постоянно что-то изучаю и читаю по программированию, даже когда уезжаю куда-нибудь, и не появляюсь тут
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034668
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryнет, я думаю что Java это прежде всего объектно-ориентированный язык программирования, для работы программы на Java требуется виртуальная машина, что влияет на скорость программ написанных на данном языке, и на требования к ресурсам. Потому мне не интересно глубоко изучать этот язык. Может быть я с ним ознакомлюсь, когда будет время. Сейчас занимаюсь C++, это ведь другой язык, и самое главное, другая парадигмаНеправильно ты учишься. Неправильно. Ты сейчас ужасающе однобок и поэтому говоришь глупости.
Забудь про Си. Забудь про С++. Тебе сейчас надо минимум полгода VBA. Вот есть у тебя задача какая-нибудь по работе? Открой Эксель и реши ее на макросах Экселя. Перестань читать умные книги, они тебе сейчас уже ничего не дадут. Вот когда станешь асом (хотя бы маленьким асом) в манипулировании Экселевскими ячейками, тогда прочитаешь умные книги еще раз. Ты очень удивишься, это я тебе гарантирую.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034708
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlSashaMercuryнет, я думаю что Java это прежде всего объектно-ориентированный язык программирования, для работы программы на Java требуется виртуальная машина, что влияет на скорость программ написанных на данном языке, и на требования к ресурсам. Потому мне не интересно глубоко изучать этот язык. Может быть я с ним ознакомлюсь, когда будет время. Сейчас занимаюсь C++, это ведь другой язык, и самое главное, другая парадигмаНеправильно ты учишься. Неправильно. Ты сейчас ужасающе однобок и поэтому говоришь глупости.
Забудь про Си. Забудь про С++. Тебе сейчас надо минимум полгода VBA. Вот есть у тебя задача какая-нибудь по работе? Открой Эксель и реши ее на макросах Экселя. Перестань читать умные книги, они тебе сейчас уже ничего не дадут. Вот когда станешь асом (хотя бы маленьким асом) в манипулировании Экселевскими ячейками, тогда прочитаешь умные книги еще раз. Ты очень удивишься, это я тебе гарантирую.

По-моему вы не шутите, но совет очень странный, VBA мне знаком и не представляет никакого интереса.
Что же конкретно глупого я сказал ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034711
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЧто же конкретно глупого я сказал ?
насчёт виртуальной машины
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034714
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wiki

.
wiki A Java virtual machine (JVM) is an abstract computing machine that enables a computer to run a Java program.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034732
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПо-моему вы не шутите, но совет очень странный, VBA мне знаком и не представляет никакого интереса.
Что же конкретно глупого я сказал ?
Сова говорит совершенно серъезно. Чем опытнее программист - тем более лаконично он подбирает
технологию для решения задачи. Когда тебе за 40 - то "трабл-шутить" можешь уже на любом ЯП.
Просто тебе станет пофиг. И мир не вращается вокруг плюсов. Мои ценные камрады + синоры-помидоры
с Винницы перешли в мой Java проект с Сей и Дельфей. Вот так вот.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034882
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryA Java virtual machine (JVM) is an abstract computing machine that
enables a computer to run a Java program.
И как наличие прокладки влияет на парадигму ООП?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39034999
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurykealon(Ruslan)SashaMercury,

нашёл интересный сайтик Algorithms and Data Structures

Спасибо. Но это ведь Java
там не только ява, там и на C++ много
и как уже сказали, неважно какой язык
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39035245
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно.

1. Пишу что Java мне не интересна.
2. Объясняю почему.
3. И говорю что занимаюсь С++
4. Мне говорят что я жутко однобок, и лучше бы на VBA стал что-то делать. И в принципе, это я пропустил мимо ушей, ибо это наше Сообщество.
5. И просто спросил, что глупого я сказал ?
6. На что мне ответили - что-то о виртуальной машине.
7. Однако ничего лишнего и глупого я сказать не мог, только изложил факты.

SSнет, я думаю что Java это прежде всего объектно-ориентированный язык программирования, для работы программы на Java требуется виртуальная машина, что влияет на скорость программ написанных на данном языке, и на требования к ресурсам

Java не ООЯ ? Виртуальной машины нет ? Это не влияет на скорость программ и на требования к ресурсам ? И программа на Java будет аналогична программе на С++ по этим двум критериям ?
В частных случаях да, как правило нет.

maytonСова говорит совершенно серъезно. Чем опытнее программист - тем более лаконично он подбирает
технологию для решения задачи. Когда тебе за 40 - то "трабл-шутить" можешь уже на любом ЯП.
Просто тебе станет пофиг. И мир не вращается вокруг плюсов. Мои ценные камрады + синоры-помидоры
с Винницы перешли в мой Java проект с Сей и Дельфей. Вот так вот.

Он вообще не об этом говорил, он говорил - учите VBA, вы однобокий человек.

И мир может быть не вращается вокруг плюсов, и может быть я ни копейки не заработаю, когда буду работать, от того, что буду знать их, но мне нравится Си, и нравится С++(хотя знаю я его слабо), и я его ещё не изучил. Вы говорите кто-то перешёл с чего на что-то. А вот если бы хирург удаляющий аппендицит перешл в нейрохирургию, пришлось ему например, вы бы легли к нему на стол ? Нельзя взять и перейти. Нужно изучить что-то (не 1 месяц), а потом переходить. Или если человек пишет какие-нибудь детективы, Донцова fe, а ей говорят, вы знаете, напишите нам что-нибудь в стиле раннего Достоевского. Вы же писатель. Что она напишет ? Порнографию. Или если режиссера снимавшего какое-нибудь современное русское дерьмо, попросили бы снять в 2003 году Возвращение Звягинцева, что бы он снял ? Когда я слышу что кто-то изучил кучу ЯП, переходит из одного проекта в другой, и тд и тп, значит этот человек, скорее всего (ибо бывают исключения), ничего толком не может.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39035257
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА вот если бы хирург удаляющий аппендицит перешл в нейрохирургию, пришлось ему например, вы бы легли к нему на стол ?Увы, но в данном случае метафора другая.

Приходит молодой танцор к старому и говорит:
- Моя партнерша не хочет танцевать со мной. Вальсировать соглашается, а как танго или балет - так ни в какую, говорит боится что я ее уроню.
- Так молодой человек, у вас же мускулов нет. Сходите в спортзал, потягайте штангу чуток, нарастите бицепсы так ваша партнерша и на акробатические танцы согласится.
- Штангу? Да вы что?! Я же танцор, артист. А в штанге нет никакого художественного выражения. Вы мне лучше посоветуйте какие еще па выучить чтобы моя постоянная партнерша доверилась чтобы я ее поднимал на сцене.

SashaMercuryКогда я слышу что кто-то изучил кучу ЯП, переходит из одного проекта в другой, и тд и тп, значит этот человек, скорее всего (ибо бывают исключения), ничего толком не может.Да, люди выучившие целый ЯП действительно так думают. А люди научившиеся программировать - не обращают внимания на язык и просто программируют.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39035262
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlSashaMercuryА вот если бы хирург удаляющий аппендицит перешл в нейрохирургию, пришлось ему например, вы бы легли к нему на стол ?Увы, но в данном случае метафора другая.

Приходит молодой танцор к старому и говорит:
- Моя партнерша не хочет танцевать со мной. Вальсировать соглашается, а как танго или балет - так ни в какую, говорит боится что я ее уроню.
- Так молодой человек, у вас же мускулов нет. Сходите в спортзал, потягайте штангу чуток, нарастите бицепсы так ваша партнерша и на акробатические танцы согласится.
- Штангу? Да вы что?! Я же танцор, артист. А в штанге нет никакого художественного выражения. Вы мне лучше посоветуйте какие еще па выучить чтобы моя постоянная партнерша доверилась чтобы я ее поднимал на сцене.

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

Все эти посылы/сообщения(и мои и ваши), имеют отношения к софистике. По существу вы так и не прокомментировали свое изначальное обвинение. Нет конкретики, а софистика мне не интересна(когда её так много).
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39035273
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury С++(хотя знаю я его слабо)
Гм.
Ты против меня профессор.
За n-лет работы с C++ так и не смог заставить себя использовать префиксные и постфиксные операторы ++, --, ... ... ...
/ну разве что иногда в тривиальных строках типа cntItems++; . Но в параметрах функций например никогда. Ну не мои они./
Вообщем если кратко - использую "классический" C++, а не "сахарный"
ООП использую редко, так как больших проектов на C++ ни когда не разрабатывал /и не буду. Он не для этого/,
а вот libraries десятки.
На мой взгляд понимание как кодировать на C++ - 1% необходимых знаний разработчика.
Честно говоря не понимаю смысл всяких там "синтаксических войн" /скорее всего эти люди вовсе и не программисты, а скорее - тролли/.

PS: Впрочем "Имеются и другие мнения".
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39035855
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury7. Однако ничего лишнего и глупого я сказать не мог, только изложил факты Вы просто не знаете фактов .
Java использует т.н. промежуточное представление: есть фасад (frontend), движок (backend) и собственно байт-код.
От ЯВУ зависит только фасад (компилятор) от среды исполнения только движок (JVM). Байт-код нейтрален и тому и другому.
Будет ли движок интерпретировать байт-код или генерировать машинный - вопрос десятый.
На практике - генерирует. Причём и динамически (JIT) и статически (ad-hoc).

P.S. Основные проблемы в том, что технологию не отличают от JLS и, что ещё хуже, от Java API ( SE / EE ).
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39035894
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012так как больших проектов на C++ ни когда не разрабатывал /и не буду. Он не для этого/,Корявенькое суждение /ниже приведена расшифровка моего "глубокого" суждения из серии "1 имею - 2 в уме"/.
Разработка на C++ компиляторов, СУБД, драйверов, libraries, ... ... ... - "самое то", а к примеру
бухгалтерских программ, ... на мой взгляд не эффективно.
Скорее всего для такого рода задач надо с использованием C++ создавать системы обработки данных:
СУБД, 1С, ... ... ...
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39035916
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВсе эти посылы/сообщения(и мои и ваши), имеют отношения к софистике. По существу вы так и не прокомментировали свое изначальное обвинение. Нет конкретики, а софистика мне не интересна(когда её так много).Что именно в моих словах ты не понял. Почему я считаю тебя однобоким? Потому что ты уже вполне достаточно развил свое понимание одного конкретного языка, но до сих пор не понял что язык это всего-лишь средство, а не цель.
Ты не понимаешь что совершенно не важно насколько быстро компьютер посчитает зарплату, а важно сумеешь ты объяснить компьютеру как эту зарплату посчитать или не сумеешь. Поэтому-то я тебе и советую сменить ЯП. И не важно насколько другой ЯП будет медленнее или быстрее, неважно насколько другой ЯП будет удобнее или неудобнее. Но ты должен поверить, (не понять умом, а принять сердцем) что любую задачу можно решить на любом языке.
Только тогда ты начнешь видеть параллели между языками, только тогда ты сможешь брать интересные идеи описанные на одном языке и использовать их в своем любимом.


Вот зачем люди учат иностранные языки? Любую книгу можно написать на русском, английском или японском. Отдельные фразы будут выглядеть и звучать по разному, но история и мысли автора будут одни и те-же на каком бы языке их не выражали. Ты с этим согласен?
А если ты умеешь читать только на одном языке - ты рискуешь не получить доступ к громадному объему полезных идей, только потому что дяди-полиглоты поленились сделать перевод.

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

Я понятно ответил почему считаю тебя ужасающе однобоким?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39035917
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

советую (настоятельно) изучить ассемблер, пока тебе не до зарабатывания денег и есть свободное время. Асм в реальной жизни врядли пригодится (тем более что зоопарк процессоров разрастается), но будет понимание как оно в реале работает.
Затем С++ (не С) тоже надо изучить чтобы понять что такое ООП, какие у ниго максимальные возможности, но опять же тоже для общего развития. Зато когда будешь писать ради зарабатывания денег на джаве, С# и т.д. и т.п. - будешь понимать нижние и верхние границы возможностей, а не ограничения выбранного языка.
Дополнительно какую-нибудь ОС взять и досконально API изучить, для понимания что может дать ОС.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39035921
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlТы не понимаешь что совершенно не важно насколько быстро компьютер посчитает зарплату, а важно сумеешь ты объяснить компьютеру как эту зарплату посчитать или не сумеешь.
Согласен если зарплату считать надо, но если что-то посерьезней? Знакомый продавец железа поставляет железо одному химику. Тот изобретает формулы и обсчитывает их не знаю в чем, но один расчет идет несколько месяцев. ХЗ в чем он их считает, есть подозрение если бы тот химик знал Си и/или асм, то может расчеты были бы в разы быстрее, а так он постоянный клиент на обновление железа.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39035926
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вижу, сегодня Сашку досталось на "орехи" . Каждый поругал понемногу.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39035938
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlТочно так же и тут - вот есть остроумные и быстрые алгоритмы и удобные способы хранить информацию.
Для SashaMercury.
И не важно на каком языке - важно суть, а язык - средство выражения.
Очень много классных идей ... в JavaScript проектах.
Да даже тот же NodeJS чего стоит.
Разработчики поняли и создали, то что давным давно нужно было реализовать ... ... ...
Так что на 100% согласен с White Owl.
Если хочешь стать кодером, то штудируй стандарты С++ и разбирай их до косточек ... ... ...
Если хочешь стать разработчиком, то должен понять, что C++ - 1% от того что ты должен знать для того, чтобы
хотя бы бы похожим на разработчика.
А разработчиком станешь тогда, когда разработка новых технологий будет не "в тягость", а в радость.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39036037
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSashaMercury7. Однако ничего лишнего и глупого я сказать не мог, только изложил факты Вы просто не знаете фактов .
Java использует т.н. промежуточное представление: есть фасад (frontend), движок (backend) и собственно байт-код.
От ЯВУ зависит только фасад (компилятор) от среды исполнения только движок (JVM). Байт-код нейтрален и тому и другому.
Будет ли движок интерпретировать байт-код или генерировать машинный - вопрос десятый.
На практике - генерирует. Причём и динамически (JIT) и статически (ad-hoc).

P.S. Основные проблемы в том, что технологию не отличают от JLS и, что ещё хуже, от Java API ( SE / EE ).

Я сказал
1. Java объектно-ориентированный язык.
2. Для запуска программы на Java требуется виртуальная машина.
3. Это влияет на требование к ресурсам.
И ничего более не сказал, ничего лишнего не сказал. То о чём вы говорите, детали, которые не опровергают 3 пункта написанных выше и не влияют на общую картину.


Критика должна быть конструктивной, замечания чёткими, понятными и по существу.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39036090
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Каким образом вышеприведенное может помешать описывать алгоритмы и структуры данных на java ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39036174
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилSashaMercury,

Каким образом вышеприведенное может помешать описывать алгоритмы и структуры данных на java ?

Никаким. А я разве сказал что это может помешать ?
А каким образом 2 гири весом в 1 кг в вашем рюкзаке могут помешать вам ходить ? Дискуссия по поводу Java в данном топике мне не интересна, ещё вчера. Комментировать что-то более по данному вопросу не стоит, это лишь бессмысленно потраченное время.

Прошу Сообщество прекратить дискуссию по яп Java в данном топике. Администрация Сообщества, прошу не закрывать данную тему.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39036183
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я может не понимаю смысла спора, но выскажусь. :)

Модератор: Начиная с этого места, весь топик ушел черти-куда. Чистим нафиг
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39036184
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury2. Для запуска программы на Java требуется виртуальная машина.

Существуют лаунчеры позволяющие запускать java-приложение просто как exe-шник. С точки
зрения Windows-пользователя он абсолютно ничем не отличается от обычного бинарника. На
такой технологии построены к примеру среда разработки IntellijIdea и Torrent-клииент Azureus/Vuze.

И вообще любая мало-мальски сложная задача через некоторое время порождает в техническом
задании целый слой рантайма с RTTI и мета-описателями который можно с успехом категоризировать
как виртуальную машину. Свои вирт. машины есть в AutoCad, Basic, Веб-браузерах, продуктах
MS, в средах разработки Perl, PHP, Python, и RPG-играх (Lua/Python).

Поэтому я-бы не стал акцентировать на ВМ так сильно. Скорее другой вопрос интересен. Возможно
ли современное прогрессивное программирование только на классической модели "исходник-бинарь"?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39036275
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне непонятен акцент на "описывать алгоритмы". В чем проблема описания?
Половина алгоритмов дискретной математики описана на Modula/ADA/Pascal.
На языках по сути мёртвых в наше время. В знаменитом многотомнике Кнута
алгоритмы описывались в виде формул либо в виде ПО Ассемблера к гипотетической
виртуальной машине. Во всех совестских книжках (до 1980 прибл) численные
методы описаны мат.формулой или блок схемой или АЯ или его бох весть
каким способом.

Поэтому для меня проблемы "описания" алгоритмов не существует. Их
можно описывать на чём угодно и как угодно. Главное чтобы договорённости
об аппарате описания были одинаково понятны для писателя и читателя.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39036366
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, petrav

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

кстати, перевод алгоритма на другой язык очень помогает в его понимании
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39036825
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ сказал
1. Java объектно-ориентированный язык.
2. Для запуска программы на Java требуется виртуальная машина.
3. Это влияет на требование к ресурсам.
И ничего более не сказал, ничего лишнего не сказал. То о чём вы говорите, детали, которые не опровергают 3 пункта написанных выше и не влияют на общую картину.1. Java не язык, Java - платформа. Это факт, которого вы не понимаете;
2. Требуется. Языков и систем, использующих виртуальные машины - много. Не факт - банальность.;
3. Системные требования встраиваемых JVM - 32Мб. Тот же ruToken Pro и аналоги обходятся, как я понимаю и меньшим.
С другой стороны, у AzulSystems есть реальный пример системы, где JVM исполняет приложение с, примерно, терабайтной кучей. Года три-четыре назад это было "всего" четверть терабайта.
Так что с ресурсами - ни о чём вообще.Критика должна быть конструктивной, замечания чёткими, понятными и по существу.Чтобы понимать ответ нужен некий базовый фундамент. А вы, уж простите, балансируете на верхушке незабитой сваи и радуетесь, что так высоко залезли.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39036836
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovС другой стороны, у AzulSystems есть реальный пример системы, где JVM исполняет приложение с, примерно, терабайтной кучей. Года три-четыре назад это было "всего" четверть терабайта.
Несколькими топиками выше мне кажется я начинаю понимать что наш пассажир кивает
то на MemModel/GC, то на VM ссылаясь на аспект т.н. "реального времени". Забавно но я специально
сидел и пытался вспомнить хотя-бы одно ТЗ из своих С++ - ных где-бы факт реалтаймовости
был отражён хотя-бы тезисно. Но... ничего не могу вспомнить. Не было таких. При том что
у меня достаточно много друзей - эмбедщиков кодорые кодят свои микро-контроллеры
на С но и в их предметной области есть нюансы. И ни один из них не делился со мной проблемами
перформанса или латентности. У них другие бока были. Вообще не в этой плоскости.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39038737
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Для желающих продолжать идите сюда: http://www.sql.ru/forum/1172924/o-primenimost-yazykov
Все новые посты не относящиеся к теме топика будут убиваться сразу.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074152
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Подскажите пожалуйста, существует ли структура данных(организована линейно) со следующими характеристиками:
1. Поиск индекса минимального/максимального элемента
2. Удаление элемента
Почему я говорю о линейной организации, по той причине что мне необходимо знать сколько элементов 'слева' и 'справа' от минимального/максимального.

Может быть подойдёт обыкновенный непрерывный массив, но проблема с удалением элемента, слишком долго и слишком часто будет выполняться эта операция.
PS
Предполагаю, что существуют типы данных из STL удовлетворяющие моим требованиям, но не уверен.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074187
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Связный список (std::list) не подойдет?
Поиск O(N) - обычный перебор.
Удаление O(1) - правка ссылок в соседних элементах.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074207
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, у меня опечатка, поиск . Писал про поиск, а думал про сортировку.

Дмитрий, не подойдёт. Как я узнаю сколько элементов справа и сколько слева. Множество элементов будет многократно обновляться(после удаления элементов)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074220
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДа, у меня опечатка, поиск . Писал про поиск, а думал про сортировку.

Дмитрий, не подойдёт. Как я узнаю сколько элементов справа и сколько слева. Множество элементов будет многократно обновляться(после удаления элементов) У тебя нет требований к функции расчета смещения, поэтому можно просто сканировать весь список.
Если оптимизировать, то надо хранить смещения Min и Max элементов и размер списка. А по мере добавления элементов в список левее или правее Min и левее или правее Max, обновлять эту вспомогательную структуру.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074233
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab,
никакие элементы в список не добавляются. Один раз добавятся и всё. Дальше будут только удаляться. В цикле. На каждой итерации цикла мне нужно искать минимальный элемент и мне необходимо узнать сколько элементов от него слева. Удаляю этот элемент и проделываю аналогичные действия. Итерации продолжаются пока есть элементы
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074235
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab
У тебя нет требований к функции расчета смещения
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074237
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДа, у меня опечатка, поиск . Писал про поиск, а думал про сортировку.

Дмитрий, не подойдёт. Как я узнаю сколько элементов справа и сколько слева. Множество элементов будет многократно обновляться(после удаления элементов)
Просто посчитаешь перебором.
Или зная порядковый номер элемента (если нашел перебором, то он известен) и размер списка - легко считается сколько справа/слева.

Ты бы лучше задачу поподробней описал. Телепатов тут нет, откуда нам знать что еще тебе надо кроме того что ты написал.
Большинство сложных задач не имеет универсального решения. Исходить надо из конкретной задачи, смотреть какие операции чаще надо выполнять, их оптимизировать в первую очередь. Скорее всего потребуется не одна структура, а несколько: в основной данные, в дополнительных метаданные для ускорения работы с данными. Возможно есть смысл алгоритм перестроить.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074261
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymcureenab,
никакие элементы в список не добавляются. Один раз добавятся и всё. Дальше будут только удаляться. В цикле. На каждой итерации цикла мне нужно искать минимальный элемент и мне необходимо узнать сколько элементов от него слева. Удаляю этот элемент и проделываю аналогичные действия. Итерации продолжаются пока есть элементы
Тут лучше вместо удаления заменять на несуществующее значение. И использовать обычные массивы.

Делаешь обычный массив значений.
Делаешь второй массив из указателей на значения. Сортируешь второй по *значение. Т.е. получаешь в каком порядке выбирать из первого.
Идешь по второму, на каждом шаге в первом выбранное заменяешь на недействительное и считаешь вправо или влево (куда ближе) сколько осталось действительных.

Дальше можно оптимизировать подсчет действительных третьим массивом. Делаешь массив счетчиков, например каждый счетчик на группу 256 элементов. Удаляя - уменьшаешь счетчик группы на 1. Для подсчета остается посчитать сколько внутри группы слева, а затем прибавить счетчики всех полных групп слева. Размер элементов в группе подбирать опытным путем.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074281
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryДа, у меня опечатка, поиск . Писал про поиск, а думал про сортировку.

Дмитрий, не подойдёт. Как я узнаю сколько элементов справа и сколько слева. Множество элементов будет многократно обновляться(после удаления элементов)
Просто посчитаешь перебором.
Или зная порядковый номер элемента (если нашел перебором, то он известен) и размер списка - легко считается сколько справа/слева.
Да. Из вспомогательных данных, тут только размер списка нужен, чтобы узнать сколько элементов осталось справа.

Если на min элемент выходить по индексу, то после его удаления придется как-то актуализировать позиции "сдвинувшихся" элементов.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074336
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymcureenab,
никакие элементы в список не добавляются. Один раз добавятся и всё. Дальше будут только удаляться. В цикле. На каждой итерации цикла мне нужно искать минимальный элемент и мне необходимо узнать сколько элементов от него слева. Удаляю этот элемент и проделываю аналогичные действия. Итерации продолжаются пока есть элементы
Требование O(1) на удаление - слишком суровое. Дело в том что даже со списком
надо будет актуализировать счетчики "количества слева".

Подумай о компромиссах.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074340
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если упростить задачу, то у нас есть неупорядоченный массив с уникальными элементами. Для каждого элемента мне нужно определить сколько элементов до него(слева от него) больше него. Асимптотика n^2 и выше меня не устраивает
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074343
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МаркДело в том что даже со списком
надо будет актуализировать счетчики "количества слева"

Вот вот
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074366
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЕсли упростить задачу, то у нас есть неупорядоченный массив с уникальными элементами. Для каждого элемента мне нужно определить сколько элементов до него(слева от него) больше него. Асимптотика n^2 и выше меня не устраивает
Мой вариант читал? 18266267
Dima T ... Делаешь массив счетчиков, например каждый счетчик на группу 256 элементов. Удаляя - уменьшаешь счетчик группы на 1. Для подсчета остается посчитать сколько внутри группы слева, а затем прибавить счетчики всех полных групп слева. Размер элементов в группе подбирать опытным путем.
Не O(1) но меньше чем n^2

В принципе можно построить бинарное дерево, где каждый узел содержит количество подузлов. Тогда при удалении надо будет уменьшить log2(N) счетчиков. И для подсчета перебрать log2(N). Т.е. общая сложность будет N*log2(N)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074390
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята. Тема структур данных - интересная и бесконечная. Можно смотреть в сторону отложенных
калькуляций или версионностей и получить на этом еще больше перформанса.

Но лучше идти от ТЗ. Особенно в части статистики. К примеру будет 1 миллиард
элементов в списке. Будет удалено примерно 100 млн. И будет 200 млн поисков.
Можно даже рассмотреть промахи поиска и удалений и сыграть на этом.

Промоделлить это и выбрать лучшую структуру.

Мне кажется такой подход - продуктивнее.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074399
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понял ТЗ такое:
SashaMercuryникакие элементы в список не добавляются. Один раз добавятся и всё. Дальше будут только удаляться. В цикле. На каждой итерации цикла мне нужно искать минимальный элемент и мне необходимо узнать сколько элементов от него слева. Удаляю этот элемент и проделываю аналогичные действия. Итерации продолжаются пока есть элементы
Или почти тоже самое другими словами
SashaMercuryЕсли упростить задачу, то у нас есть неупорядоченный массив с уникальными элементами. Для каждого элемента мне нужно определить сколько элементов до него(слева от него) больше него.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074443
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercurymcureenab,
никакие элементы в список не добавляются. Один раз добавятся и всё. Дальше будут только удаляться. В цикле. На каждой итерации цикла мне нужно искать минимальный элемент и мне необходимо узнать сколько элементов от него слева. Удаляю этот элемент и проделываю аналогичные действия. Итерации продолжаются пока есть элементы
Тут лучше вместо удаления заменять на несуществующее значение. И использовать обычные массивы.

Делаешь обычный массив значений.
Делаешь второй массив из указателей на значения. Сортируешь второй по *значение. Т.е. получаешь в каком порядке выбирать из первого.
Идешь по второму, на каждом шаге в первом выбранное заменяешь на недействительное и считаешь вправо или влево (куда ближе) сколько осталось действительных.

Дальше можно оптимизировать подсчет действительных третьим массивом. Делаешь массив счетчиков, например каждый счетчик на группу 256 элементов. Удаляя - уменьшаешь счетчик группы на 1. Для подсчета остается посчитать сколько внутри группы слева, а затем прибавить счетчики всех полных групп слева. Размер элементов в группе подбирать опытным путем.

К сожалению будем иметь
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074445
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получится заменять каждый элемент недействительным, к сожалению. Конечно я об этом подумал
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074481
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЕсли упростить задачу, то у нас есть неупорядоченный массив с уникальными элементами. Для каждого элемента мне нужно определить сколько элементов до него(слева от него) больше него. Асимптотика n^2 и выше меня не устраиваетЭто как то уж очень упрощенно и очевидно. Получается нужно один раз пройти список подсчитывая количество просмотренных элементов и каждому элементу списка присвоить текущее значение счетчика.

Но каждое удаление элемента приведет к сдвигу хвоста списка. В массиве, это сдвиг элементов, в односвязном списке это перенумерация элементов. Думаю, в этом смысле альтернатив нет.

Так или иначе, после удаления придется пробегать весь хвост и выполнять декремент номеров, но искать элементы можно будет по индексу.

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

Трудно сказать что быстрее. От данных зависит.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074483
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryК сожалению будем иметь
Это если сделать только то что ты красным выделил. Если сделать с группами - будет быстрее. Например К размер группы, тогда для подсчета надо перебрать: К/2 (внутри группы) + N/2K (количество целых групп). Остается подобрать такое К чтобы К/2+N/2K было минимальным. Если добавить что К=2^M (чтобы считать быстрее) то подбор несложный.
Если с деревом 18266267 то Тут по сути группирование групп в несколько уровней.
SashaMercuryНе получится заменять каждый элемент недействительным, к сожалению. Конечно я об этом подумал
Почему? Есть еще какие-то условия или просто значений не хватает? Если не хватает - то минимально допустимое. Оно используется только на первом шаге, затем оно не встречается.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074544
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЕсли упростить задачу, то у нас есть неупорядоченный массив с уникальными элементами. Для каждого элемента мне нужно определить сколько элементов до него(слева от него) больше него. Асимптотика n^2 и выше меня не устраивает

Это построение индекса. Насколько я себе представляю, в сбалансированном индексе можно легко рассчитать количество элементов на "ветвях" справа и слева. По крайней мере добавляя в индекс последний ключ нужно будет обновить не более log(n) блоков индекса, чтобы скорректировать вес обновленной ветви от листа до корня. И еще два блока, если потребуется балансировка.

Берем очередной элемент, добавляем его в индекс и одновременно суммируем на каждом ярусе дерева, сколько элементов оказалось (меньше/больше). Причем все они находятся до текущего элемента, ведь тех что после в индексе еще нет.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074550
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саша давай макет.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39074587
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Структура блока такая:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct block {
   string &key;  // Ключ для сравнения
   struct block *gt; // Блок, если искомый ключ больше key. Когда проходим в сторону gt, делаем i_gt++.
   struct block *le; // Блок, если искомый ключ меньше или равен key. Когда проходим в сторону le, делаем sm += i_gt.
   unsigned long i_gt; // Число проходов и добавлений в ветку gt. Балансировка осложняется необходимостью актуализировать i_gt.
   size_t idx; // Индекс элемента в исходном массиве. Заметим, что key == a[idx].key.
 };



// Для затравки добавляем первый ключ.

sm = 0;
struct block *root = { a[0].key, null, bull, 0, 0, 0 };
a[0].i_gt = sm;

ну и т.д.
....
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39075008
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabSashaMercuryЕсли упростить задачу, то у нас есть неупорядоченный массив с уникальными элементами. Для каждого элемента мне нужно определить сколько элементов до него(слева от него) больше него. Асимптотика n^2 и выше меня не устраиваетЭто как то уж очень упрощенно и очевидно. Получается нужно один раз пройти список подсчитывая количество просмотренных элементов и каждому элементу списка присвоить текущее значение счетчика.

Но каждое удаление элемента приведет к сдвигу хвоста списка. В массиве, это сдвиг элементов, в односвязном списке это перенумерация элементов. Думаю, в этом смысле альтернатив нет.

Так или иначе, после удаления придется пробегать весь хвост и выполнять декремент номеров, но искать элементы можно будет по индексу.

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

Трудно сказать что быстрее. От данных зависит.

Асимптотика должна быть одинаковой, так что ничего не быстрее
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39075011
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Асимптотика добавления в дерево зависит от его высоты, а высота его зависит от того в каком порядке в него попадают данные, и может варьироваться от до . Нельзя гарантировать что порядок данных будет хорошим
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39075013
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryАсимптотика добавления в дерево зависит от его высоты, а высота его зависит от того в каком порядке в него попадают данные, и может варьироваться от до . Нельзя гарантировать что порядок данных будет хорошим
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39075033
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

эх, вот придумал бы ты балансировку для 2-D дерева за log(n), сразу стал бы знаменитым
позвали бы тебя для баз всяких алгоритмы придумывать
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39075077
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurySashaMercuryАсимптотика добавления в дерево зависит от его высоты, а высота его зависит от того в каком порядке в него попадают данные, и может варьироваться от до . Нельзя гарантировать что порядок данных будет хорошим



Высота сбалансированного дерева (АВЛ-дерево) равна log(n) для любых исходных данных. От распределения данных зависит только число вращений вершин во время добавления или удаления.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39075088
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabSashaMercuryпропущено...




Высота сбалансированного дерева (АВЛ-дерево) равна log(n) для любых исходных данных. От распределения данных зависит только число вращений вершин во время добавления или удаления.

Это близко, но на самом деле не так.

Если использовать сбалансированные деревья (AVL или RB), то задачу пожалуй можно решить. Я ещё думаю, стоит ли оно того, может быть есть другие способы её решения
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39075173
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymcureenabпропущено...


Высота сбалансированного дерева (АВЛ-дерево) равна log(n) для любых исходных данных. От распределения данных зависит только число вращений вершин во время добавления или удаления.

Это близко, но на самом деле не так.

Разница длинны двух любых маршрутов от корня к листьям в АВЛ дереве 0 или 1. Это существенно только для совсем маленького объема данных, когда в дереве мало ярусов. Но наверное никакая структура или алгоритм не даст в общем случае все маршруты равной длинны. Форма дерева в общем случае будет зависеть от порядка исходных данных, но когда ярусов много, это несущественно.

У тебя еще какие то соображения есть?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39075429
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabSashaMercuryпропущено...


Это близко, но на самом деле не так.

Разница длинны двух любых маршрутов от корня к листьям в АВЛ дереве 0 или 1. Это существенно только для совсем маленького объема данных, когда в дереве мало ярусов. Но наверное никакая структура или алгоритм не даст в общем случае все маршруты равной длинны. Форма дерева в общем случае будет зависеть от порядка исходных данных, но когда ярусов много, это несущественно.

У тебя еще какие то соображения есть?

Ваше первое утверждение не совсем верно, вот и всё. Одно дело если вы используете O нотацию и говорите об оценках, но если вы говорите конкретные функции, то вы ошибаетесь. Используя O-нотацию мы имеем
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39075862
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал макет
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// Замер времени
class timer {
	clock_t start;
	char buf[20];
public:
	timer();
	void init(); // начало замера
	const char* value(); // текущее значение
};

timer::timer()
{
	init();
}

void timer::init()
{
	start = clock();
}

// Вывод времени
const char* timer::value()
{
	clock_t t = clock() - start;
	int sec = t / CLOCKS_PER_SEC;
	if(sec > 1000) {
		sprintf(buf, "%.0f sec", (double)t / CLOCKS_PER_SEC);
	} else if(sec > 100) {
		sprintf(buf, "%.1f sec", (double)t / CLOCKS_PER_SEC);
	} else if(sec > 10) {
		sprintf(buf, "%.2f sec", (double)t / CLOCKS_PER_SEC);
	} else {
		sprintf(buf, "%.3f sec", (double)t / CLOCKS_PER_SEC);
	}
	return buf;
}

//******************************************************
// Размер тестового массива
#define TEST_SIZE 50000
//******************************************************

// Заполнение исходных данных
void init(int* arr)
{
	timer t;
	// Заполняем уникальными значениями
	for(int i = 0; i != TEST_SIZE; i++) arr[i] = i;
	// Перемешиваем
	int r = 54323; // ГСЧ с постоянной последовательстью
	for(int i = 0; i != TEST_SIZE; i++) {
		do {
			r = (r * 12347 + 1) % TEST_SIZE;
		} while(r < 0);
		
		int j = arr[i];
		arr[i] = arr[r];
		arr[r] = j;
	}
	printf("Init %u elements. %s\n", TEST_SIZE, t.value());
}

// Вывод содержимого массива
void print(const char* text, int* arr)
{
	printf(text);
	unsigned int check = 0;
	for(int i = 0; i < TEST_SIZE; i++) {
		if(i < 10) printf("%d ", arr[i]);
		check += i * arr[i];
	}
	printf(" sum %X\n", check);
}

// Решение перебором
void perebor(int* data, int* res)
{
	timer t;
	for(int i = 0; i < TEST_SIZE; i++) {
		for(int j = 0; j < i; j++) {
			if(data[j] > data[i]) res[i]++;
		}
	}
	printf("Perebor %s\n", t.value());
}

int main(int argc, char* argv[])
{

	int* data = (int*)calloc(TEST_SIZE, sizeof(int)); // массив исходных данных
	int* res = (int*)calloc(TEST_SIZE, sizeof(int)); // массив для результата
	if(!data || !res) {
		printf("No memory\n");
	} else {
		// Заполнение исходных данных
		init(data); 
		print("Data   ", data);
		// Расчет
		perebor(data, res); // менять на свое
		// Вывод результата
		print("Result ", res);
	}

	if(data) free(data);
	if(res) free(res);

	system("pause");
	return 0;
}


Там решение только перебором. Но есть генератор исходных данных, замер времени, вывод данных и результата с контрольной суммой.

Кому интересно: писать свою функцию вместо perebor(). Перебор не быстро работает. 1,5 сек для массива в 50 тыс. элементов. 6 сек для 100 тыс. Чистый N^2

Попробую свою идею 18266267 затестить на скорость. Надо только определиться можно исходные данные портить или нет. Предлагаю портить, т.к. несложно биткарту добавить для пометок, сложность от этого не изменится, но лишний код добавится.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39076116
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему используется именно 12347?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39076128
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПочему используется именно 12347?
12345 как-то не очень перемешивало, взял ближайшее простое.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39097902
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Известно что некоторые структуры данных можно реализовать разными способами. Например, очередь можно реализовать с использованием двусвязного списка, либо с использованием непрерывной области памяти, и др. Но как нам известно у любой очереди существуют интерфейсы(если это слово корректно употребить в данном случае) dequeue и enqueue. Правильно ли я понимаю, что для того чтобы реализовать различный вариации определения очередей(здесь слово 'определение' понимается в контексте class definition) грамотным будет первым делом создать некий базовый тип(класс), и наследовать вариации различных определений от него ? Но тогда возникает такой вопрос, данный класс должен быть абстрактным классов, либо достаточно определить все методы этого класса с меткой protecded ? Подскажите пожалуйста
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39097908
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.
Известно что некоторые структуры данных можно реализовать разными способами. Например, очередь можно реализовать с использованием двусвязного списка, либо с использованием непрерывной области памяти, и др. Но как нам известно у любой очереди существуют интерфейсы(если это слово корректно употребить в данном случае) dequeue и enqueue. Правильно ли я понимаю, что для того чтобы реализовать различный вариации определения очередей(здесь слово 'определение' понимается в контексте class definition) грамотным будет первым делом создать некий базовый тип(класс), и наследовать вариации различных определений от него ? Но тогда возникает такой вопрос, данный класс должен быть абстрактным классов, либо достаточно определить все методы этого класса с меткой protecded ? Подскажите пожалуйста
если в плане ООП, то да, наследование от базового класса
но в плане эффективности это не гуд, поэтому и используют шаблоны\макросы где все вызовы в итоге можно сделать статическими и компилятор может агрессивно задействовать оптимизацию
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39097925
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)SashaMercuryЗдравствуйте.
Известно что некоторые структуры данных можно реализовать разными способами. Например, очередь можно реализовать с использованием двусвязного списка, либо с использованием непрерывной области памяти, и др. Но как нам известно у любой очереди существуют интерфейсы(если это слово корректно употребить в данном случае) dequeue и enqueue. Правильно ли я понимаю, что для того чтобы реализовать различный вариации определения очередей(здесь слово 'определение' понимается в контексте class definition) грамотным будет первым делом создать некий базовый тип(класс), и наследовать вариации различных определений от него ? Но тогда возникает такой вопрос, данный класс должен быть абстрактным классов, либо достаточно определить все методы этого класса с меткой protecded ? Подскажите пожалуйста
если в плане ООП, то да, наследование от базового класса
но в плане эффективности это не гуд, поэтому и используют шаблоны\макросы где все вызовы в итоге можно сделать статическими и компилятор может агрессивно задействовать оптимизацию

Что такое ООП мы все понимаем по разному. Мне нужно чтобы это было грамотно и правильно. Использование типов должно быть. Но правильное проектирование типов(классов) вопрос сложный. Мне не очень понятно почему при таком проектировании, должны возникнуть проблемы на которые вы указали, поясните пожалуйста
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39097953
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот только получается что абстрактный класс о котором я говорил выше должен быть оформлен в виде шаблона класса
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39097968
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЧто такое ООП мы все понимаем по разному. Мне нужно чтобы это было грамотно и правильно. Использование типов должно быть. Но правильное проектирование типов(классов) вопрос сложный. Мне не очень понятно почему при таком проектировании, должны возникнуть проблемы на которые вы указали, поясните пожалуйста
В ООП как и в других ученьях есть различные философии и практики.
Если следовать SOLID то я бы акцентировал внимание на 4-й принцип (буква I)
рекомендует Interface segregation principle (Много специализированных интерфейсов лучше, чем один универсальный.) .
Если в queue на базе памяти и двузсвязного списка можно выделить два и более
интерфейса - то я бы это сделал.

Не знаю про какую такую эффективность толкует Руслан - но скорее всего речь
идёт об оптимизации вирутального вызова. Если говорить о макросах - то это не
есть ООП. Это нечто более примитивное и механическое. В С++ шаблоны+макросы
возведены в особый ранг технических приёмов которые и делают С++ быстрым.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39098040
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВот только получается что абстрактный класс о котором я говорил выше должен быть оформлен в виде шаблона класса
ну вот видишь, смысл тогда от всей этой дребедени с наследованием, полиморфизмом, сделал шаблон и не паришься
названия одинаковые методам дай да и всё, хочешь массив, используй шаблон с массивом, хочешь классическую - тоже проблем нет
всё у тебя разложится в конкретный код, нужный тебе именно для этого типа и с нужным тебе алгоритмом и структурой хранения

в STL работает, ёжики колются, но .. - эффективнее по использованию и скорости придумать малореально
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39099062
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)SashaMercuryВот только получается что абстрактный класс о котором я говорил выше должен быть оформлен в виде шаблона класса
ну вот видишь, смысл тогда от всей этой дребедени с наследованием, полиморфизмом, сделал шаблон и не паришься
названия одинаковые методам дай да и всё, хочешь массив, используй шаблон с массивом, хочешь классическую - тоже проблем нет
всё у тебя разложится в конкретный код, нужный тебе именно для этого типа и с нужным тебе алгоритмом и структурой хранения

в STL работает, ёжики колются, но .. - эффективнее по использованию и скорости придумать малореально

Шаблоны будут для нескольких реализаций независимо от того будет ли абстрактный класс или нет.
В любом случае спасибо всем, решил отказаться от этой идеи в силу того что не так глубоко изучил абстрактные классы, и советов выше.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39099108
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только вот что странно, раньше, когда у меня был просто класс, и было три файла:
q.h, q.cpp, и в main.cpp я подключал q.h программа собиралась корректно. Теперь я сделал класс шаблонным, определение методов в q.cpp выглядит следующим образом

Код: plaintext
1.
2.
3.
4.
5.
template <typename T>
queue1<T>::queue1()
{
	//smth 
}



происходит ошибка при сборке. Становятся невидимыми определения этих методов(из q.cpp). Это связано с тем что класс стал шаблонным, и собирать его нужно иначе ?
PS когда подключаю в main q.cpp всё ок, но мне это не нравится.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39099116
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryТолько вот что странно, раньше, когда у меня был просто класс, и было три файла:
q.h, q.cpp, и в main.cpp я подключал q.h программа собиралась корректно. Теперь я сделал класс шаблонным, определение методов в q.cpp выглядит следующим образом

Код: plaintext
1.
2.
3.
4.
5.
template <typename T>
queue1<T>::queue1()
{
	//smth 
}



происходит ошибка при сборке. Становятся невидимыми определения этих методов(из q.cpp). Это связано с тем что класс стал шаблонным, и собирать его нужно иначе ?
PS когда подключаю в main q.cpp всё ок, но мне это не нравится.


весь код шаблоный должен быть в заголовке .
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39099120
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему так ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39099234
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПочему так ?компилятор должен ведь знать, чего именно ему генерить, не?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39099327
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryПочему так ?компилятор должен ведь знать, чего именно ему генерить, не?
Егорыч это ответ в стиле кэпа.
Думаю что имеет смысл нам всем вспомнить почему в С++ исходный код разделён
на два подтипа текстов кода.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39099401
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДумаю что имеет смысл нам всем вспомнить почему в С++ исходный код разделён
на два подтипа текстов кода.мне кажется, надо вспомнить правила инстанцирования шаблона, и, собственно, вопрос пропадёт сам собой.
Была, правда, попытка ввести ключевое слово export, или прагма( export ), не помню, но не взлетело.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100154
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychmaytonДумаю что имеет смысл нам всем вспомнить почему в С++ исходный код разделён
на два подтипа текстов кода.мне кажется, надо вспомнить правила инстанцирования шаблона, и, собственно, вопрос пропадёт сам собой.
Была, правда, попытка ввести ключевое слово export, или прагма( export ), не помню, но не взлетело.

Почему это происходит так как происходит, примерно понятно. Когда происходит сборка программы линковщик не может найти конкретную реализацию методов для конкретного типа объекта созданного класса. Явное инстанцирование не самый хороший вариант (хотя его можно использовать, я так думаю (кстати, интересно как в STL сделано)). Непонятно почему до сих пор эта проблема не решена, шаблоны, как мне пока кажется, слишком хороший инструмент(особенно для С++, с учётом типизации данного языка), чтобы иметь какие-то особенности по реализации. Работа с ними должна быть проще, без каких-либо особенностей
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100158
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, линковщик видит что необходимо провести инстанцирование шаблона с параметрами int и elseType например, почему бы не провести повторную компиляцию некоторых модулей в которой провести явное инстанцирование данных шаблонных классов ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100165
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНепонятно почему до сих пор эта проблема не решена
Потому что никакой проблемы нет.
SashaMercuryНапример, линковщик видит что необходимо провести инстанцирование шаблона с параметрами int и elseType
Линковщик не знает ни про шаблоны, ни про классы. Он видит только переменные и функции.
Инстанцированием занимается компилятор. Если он этого не сделал, то линковщик не найдет соответствующую функцию.

На практике никакой проблемы нет, т.к. шаблоны размещаются в заголовках и включаются в каждую единицу трансляции, где они используются.
А на линковщик возлагается устранение дубликатов инстанцированных шаблонов.
И это работает.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100217
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНапример, линковщик видит что необходимо провести инстанцирование шаблона с параметрами int и elseType например, почему бы не провести повторную компиляцию некоторых модулей в которой провести явное инстанцирование данных шаблонных классов ? Повторную компиляцию? А где он исходники cpp возьмет, если, положим, библиотека поставляется с закрытым кодом?

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

Другой подход - использовать шаблон как обертку над обычными не шаблонными функциями.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100234
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий, я лишь говорил о том, что как правило определение класса, и реализация методов класса расположены в разных файлах .h и .cpp Для шаблонных классов несколько иначе. И мне это не очень нравится, это только моё мнение. Я подумаю о том что вы написали, спасибо. У меня только один вопрос: можно ли решить эту 'проблему' на уровне препроцессора/компилятора/линкера ? Чтобы разработчик об этом не задумывался. Например, на этапе препроцессорной обработки определять какие потребуются инстанцирования и добавлять соответствующий код(для вызова явного инстанцирования) в соответствующие заголовочные файлы. Принципиально такое возможно ?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100265
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryАнатолий, я лишь говорил о том, что как правило определение класса, и реализация методов класса расположены в разных файлах .h и .cpp Для шаблонных классов несколько иначе. И мне это не очень нравится, это только моё мнение. Я подумаю о том что вы написали, спасибо. У меня только один вопрос: можно ли решить эту 'проблему' на уровне препроцессора/компилятора/линкера ? Чтобы разработчик об этом не задумывался. Например, на этапе препроцессорной обработки определять какие потребуются инстанцирования и добавлять соответствующий код(для вызова явного инстанцирования) в соответствующие заголовочные файлы. Принципиально такое возможно ?
только если поменяют формат объектных файлов
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100271
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНапример, на этапе препроцессорной обработки определять какие потребуются инстанцирования и добавлять соответствующий код(для вызова явного инстанцирования) в соответствующие заголовочные файлы.а откуда компилятор возьмёт этот код, как думаешь? Компилятор как догадается, что ему надо заглянуть в cpp-файл, и в какой именно?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100281
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryНапример, на этапе препроцессорной обработки определять какие потребуются инстанцирования и добавлять соответствующий код(для вызова явного инстанцирования) в соответствующие заголовочные файлы.а откуда компилятор возьмёт этот код, как думаешь? Компилятор как догадается, что ему надо заглянуть в cpp-файл, и в какой именно?
По имени файла.

Ладно, пусть вы все правы, я не претендую. Нельзя, значит нельзя. Раз все в Сообществе считают что эта ситуация не даёт каких-то проблем, и вообще, не нужно на ней заострять внимание, то соглашусь. Я вам верю. Спасибо всем за ваше мнение по данному вопросу
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100334
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryАнатолий, я лишь говорил о том, что как правило определение класса, и реализация методов класса расположены в разных файлах .h и .cpp Для шаблонных классов несколько иначе. И мне это не очень нравится, это только моё мнение. Я подумаю о том что вы написали, спасибо. У меня только один вопрос: можно ли решить эту 'проблему' на уровне препроцессора/компилятора/линкера ? Чтобы разработчик об этом не задумывался. Например, на этапе препроцессорной обработки определять какие потребуются инстанцирования и добавлять соответствующий код(для вызова явного инстанцирования) в соответствующие заголовочные файлы. Принципиально такое возможно ?

Это скорее вопрос к IDE, чем к компилятору. Вероятно, в природе есть утилиты которые помогают автоматически создавать код для явного инстанцирования шаблонов. При желании ты можешь сам сделать такую и добавить в процедуру сборки проекта.

В общем случае, когда библиотека шаблонов разрабатывается и компилируется отдельно, разработчик библиотеки должен сам собрать эти данные из других проектов или из требований заказчиков и в как-то передать их в компилятор.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100647
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЧтобы разработчик об этом не задумывался.
А не надо задумываться. Шаблоны - всегда помещать в заголовок.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100804
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саш. Яж говорил что ты скоро возненавидишь С++ лютой ненавистью. Ты - математик. И твоя стезя - другое.

Just IMHO.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39100998
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСаш. Яж говорил что ты скоро возненавидишь С++ лютой ненавистью. Ты - математик. И твоя стезя - другое.

Just IMHO.

Математиками можно смело назвать Вейерштрасса, Коши, Гаусса, Колмогорова, Маркова, Красносельского, Зарубина и других, я только изучаю математику и искренне люблю её.

Марк, мне интересны эти языки, навряд-ли я когда-то буду зарабатывать этим на жизнь, но мне это нравится. Из того что порой мне что-то кажется непонятным и я с чем-то не согласен, не следует что мне начинает не нравиться этот язык, из этого, как правило, следует что я мало знаю для того, чтобы понять почему именно так правильно и должно быть.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39101026
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну дай бох.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39101295
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСаш. Яж говорил что ты скоро возненавидишь С++ лютой ненавистью.
Рано еще про ненависть говорить, это он еще за джаву не взялся
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290119
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
У меня возник вопрос в контексте С++. Существует ли такой контейнер или другая стандартная реализация следующей структуры(контейнера):
1. Содержатся только уникальные элементы типа float, проверка до третьего знака. Соответственно вставка не происходит в том случае, если элемент уже содержится в множестве.
2. Элементы отсортированы по возрастанию.
3. Никаких ограничений на асимптотику CRUD операций.

Скорее всего имею бинарное дерево, реализация классическая. Но в контексте изучения С++, хотелось бы использовать существующие возможности языка. Скорее всего мне необходимо изучить работу с контейнером map, верно ли это? Или можно подойти к данной задаче с другой стороны?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290123
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут set<> достаточно. Только еще свой компаратор придется написать, для сравнения 3-х знаков.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290132
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если "проверка до третьего знака" означает фиксированные три знака после запятой, то можно биткарту (vector<bool>) использовать, т.к. точность float всего 7 десятичных знаков, то потребуется 1,25 Мб под биткарту. Проверка наличия будет быстрее.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290138
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если посмотреть "под углом" fixed-point операций то постановка упрощается. IMHO.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290152
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, спасибо! Посмотрю сегодня контейнер set.

Dima TЕсли "проверка до третьего знака" означает фиксированные три знака после запятой, то можно биткарту (vector<bool>) использовать, т.к. точность float всего 7 десятичных знаков, то потребуется 1,25 Мб под биткарту. Проверка наличия будет быстрее.

Я почему думал о сравнении . Этого в данном случае будет недостаточно?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290222
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДмитрий, спасибо! Посмотрю сегодня контейнер set.

Dima TЕсли "проверка до третьего знака" означает фиксированные три знака после запятой, то можно биткарту (vector<bool>) использовать, т.к. точность float всего 7 десятичных знаков, то потребуется 1,25 Мб под биткарту. Проверка наличия будет быстрее.

Я почему думал о сравнении . Этого в данном случае будет недостаточно?
По твоей изначальной формулировке можно также предположить что интересны первые три знака мантиссы. В данном случае фиксированные три знака после запятой.
Эту формулу надо будет в компаратор, пример под спойлером.
пример std::set
Код: 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.
#include <set>

struct fixed_compare :
	public
	std::binary_function<float, float, bool>
{
	bool operator() (const float& lhs, const float& rhs) const
	{
		if (abs(lhs - rhs) < 0.0009) {
			return 0; // ==
		} else {
			return lhs < rhs;
		}
	}
};

typedef std::set<float, fixed_compare> fixed_set_t;

int main() {
	fixed_set_t arr;
	arr.insert(1.000);
	arr.insert(1.002);
	arr.insert(1.002);
	arr.insert(1.001);
	arr.insert(1.0011);
	for (fixed_set_t::iterator it = arr.begin(); it != arr.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';
	return 0;
}

...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290254
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Не работает. Выводит 1.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290260
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglDima T,

Не работает. Выводит 1.
У меня работает MS VC 2015
Код: plaintext
1.
 1 1.001 1.002
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290261
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ппц ошибка. Помогла замена abs() на fabs().

Причина в каких то округлениях (

Тестил тут http://cpp.sh
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290270
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglПричина в каких то округлениях (
abs() сначала к целочисленному привел, т.к. должно быть так
http://www.cplusplus.com/reference/cstdlib/abs/ int abs ( int n);
long int abs ( long int n);
long long int abs (long long int n);
а MS от себя добавил
Код: plaintext
1.
float abs(float)


потому я и не заметил. Лучше заменить на fabs()
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290294
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас #include разные
http://www.cplusplus.com/reference/cmath/abs/ double abs (double x);
float abs (float x);
long double abs (long double x);
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290307
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tа MS от себя добавил
Это не MS а С++ добавил от себя ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290362
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я добавлял <cmath>, не помогло.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290365
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня
Код: plaintext
1.
#include <math.h>
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290687
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, а почему компаратор реализован именно так, как он реализован? Я думал что это будет классическая функция. Так необходимо для работы с set?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290690
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДмитрий, а почему компаратор реализован именно так, как он реализован? Я думал что это будет классическая функция. Так необходимо для работы с set?
Это требование стандарта
http://en.cppreference.com/w/cpp/concept/Compare
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290702
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, спасибо, но я мало что понял по существу, здесь видимо влияет мой незначительный объем знаний в С++.

В зарубежных работа по математике для обозначения операторов или левой части уравнения иногда используют lhs, только потому я догадался почему параметры функции названы так, как они названы. Впрочем затем я открыл стандарт, и нашел там аналогичные обозначения :)
Не очень понял почему после имени структуры идет двоеточие, но думаю, что смогу разобраться. У меня другой вопрос: сколько значений возвращает данный компаратор и какие эти значения?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290782
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДмитрий, а почему компаратор реализован именно так, как он реализован? Я думал что это будет классическая функция. Так необходимо для работы с set?
Так необходимо для сравнения float . Т.к. это экспоненциальный формат и при вычислении накапливается погрешность в последних разрядах мантиссы, то его нельзя просто сравнить, надо учитывать погрешность.

Второй вариант - перед сохранением в set округлять, тогда можно будет вообще без компаратора обойтись.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290804
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, пример с демонстрацией проблемы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
typedef std::set<float> fixed_set_t;

int main() {
	fixed_set_t arr;
	float x = 7.;
	float y = x / 13.;
	float z = y * 13.;
	printf("%s\n", x == z ? "true" : "false");
	arr.insert(x);
	arr.insert(y);
	arr.insert(z);
	for (fixed_set_t::iterator it = arr.begin(); it != arr.end(); ++it)
		std::cout << ' ' << *it << "\n";
	return 0;
}

...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290822
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryУ меня другой вопрос: сколько значений возвращает данный компаратор и какие эти значения?
два значения. true/false. Просто сравнение "lhs < rhs"
http://www.cplusplus.com/reference/set/set/set/
Код: plaintext
1.
2.
3.
4.
struct classcomp {
  bool operator() (const int& lhs, const int& rhs) const
  {return lhs<rhs;}
};
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291086
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryДмитрий, а почему компаратор реализован именно так, как он реализован? Я думал что это будет классическая функция. Так необходимо для работы с set?
Так необходимо для сравнения float . Т.к. это экспоненциальный формат и при вычислении накапливается погрешность в последних разрядах мантиссы, то его нельзя просто сравнить, надо учитывать погрешность.

Второй вариант - перед сохранением в set округлять, тогда можно будет вообще без компаратора обойтись.

Да нет, мне непонятен синтаксис реализации, но это мои проблемы - разберусь)

Dima Tдва значения. true/false. Просто сравнение "lhs < rhs"

Но в том случае если разница между числами меньше погрешности, то происходит возврат 0. Этот момент не очень понял
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291105
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНо в том случае если разница между числами меньше погрешности, то происходит возврат 0. Этот момент не очень понял
Этот функтор должен реализовывать операцию сравнения "меньше".
Т.е. если первое число меньше второго, то возвращается true, а иначе (включая равенство в пределах заданной погрешности) - false.

ЗЫ. Двоеточие это синтаксис наследования.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291109
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDima Tдва значения. true/false. Просто сравнение "lhs < rhs"

Но в том случае если разница между числами меньше погрешности, то происходит возврат 0. Этот момент не очень понял
ИМХУ: для проверки уникальности надо выполнить сравнение, имея компаратор сравнивающий только на меньше можно сделать так
Код: plaintext
1.
if(!comp(lhs, rhs) && !comp(rhs, lhs)) ... значит равно
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291110
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, и true==1, false==0.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291130
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е данный код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct fixed_compare :
	public
	std::binary_function<float, float, bool>
{
	bool operator() (const float& lhs, const float& rhs) const
	{
		if (abs(lhs - rhs) < 0.0009) {
			return 0; // ==
		} else {
			return lhs < rhs;
		}
	}
};


аналогичен такому?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct fixed_compare : public std::binary_function<float, float, bool>
{
	bool operator() (const float& lhs, const float& rhs) const
	{
		return !((abs(lhs - rhs) < 0.0009) || (lhs>rhs));
	}
};
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291135
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А binary_function судя о всему один абстрактных классов стандартной библиотеки
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291138
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне не нравится, что он с маленькой буквы, кажется что это функция или метод, а не класс
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291139
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аналогичен, можно покороче
Код: plaintext
1.
return lhs < rhs && abs(lhs - rhs) > 0.0009;
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291142
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне не нравится, что он с маленькой буквы, кажется что это функция или метод, а не класс
В STL все с маленькой буквы и с подчеркиваниями если несколько слов. Такой стиль выбрали, привыкай. http://www.cplusplus.com/reference/stl/
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291152
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все спасибо C: В целом я понял, детали постараюсь сам разобрать
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291161
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА binary_function судя о всему один абстрактных классов стандартной библиотеки
На самом деле для реализации компаратора set от нее можно вообще не наследовать. Просто сделайте класс с оператором ().
Единственное предназначение этого наследования - подключить вложенные типы, которые дают возможность узнать типы аргументов и результата (если это нужно для реализации шаблона, использующего это класс).
В С++11 это можно сделать напрямую, без помощи со стороны класса, поэтому binary_function (и подобные) будет удалена, так что ее не надо даже начинать использовать.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291165
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНа самом деле для реализации компаратора set от нее можно вообще не наследовать. Просто сделайте класс с оператором ().
Это я откуда-то скопипастил с binary_function, тут примеры без нее.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291169
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне не нравится, что он с маленькой буквы, кажется что это функция или метод, а не класс
На самом деле, это даже логично, т.к. во многих случаях никакой разницы между использованием класса и функции нет ))

Код: plaintext
1.
2.
auto val1 = class_name(args);
auto val2 = function_name(args);
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291172
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryМне не нравится, что он с маленькой буквы, кажется что это функция или метод, а не класс
На самом деле, это даже логично, т.к. во многих случаях никакой разницы между использованием класса и функции нет ))

Код: plaintext
1.
2.
auto val1 = class_name(args);
auto val2 = function_name(args);



В первом случае может вызываться только конструктор?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291173
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВ первом случае может вызываться только конструктор?
В первом случае - это создание экземпляра, который потом присваивается в переменную.
Что при этом вызывается зависит от типов слева и справа от =.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291178
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskySashaMercuryМне не нравится, что он с маленькой буквы, кажется что это функция или метод, а не класс
На самом деле, это даже логично, т.к. во многих случаях никакой разницы между использованием класса и функции нет ))

Код: plaintext
1.
2.
auto val1 = class_name(args);
auto val2 = function_name(args);


Для полноты, раз тема про функторы:
Код: plaintext
1.
2.
3.
auto val1 = class_name(args);
auto val2 = function_name(args);
auto val3 = object_name(args);
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291179
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryВ первом случае может вызываться только конструктор?
В первом случае - это создание экземпляра, который потом присваивается в переменную.
Что при этом вызывается зависит от типов слева и справа от =.

Создание экземпляра, понятно. Вызывается один из конструкторов, какой именно зависит от типов параметров конструктора. fe:
Код: plaintext
1.
2.
T_L val1 = class_name(T4 arg0, T2 arg1);
T_L val1 = class_name(T8 arg0,T7 arg1, T1 arg2);


В данном случае будут созданы экземпляры пользовательского типа, но при этом каждый будет создан образом, описанным в своем конструкторе. Но как на создание экземпляра может повлиять T_L? Или я что-то не так понял
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291182
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинДля полноты, раз тема про функторы:
Код: plaintext
1.
2.
3.
auto val1 = class_name(args);
auto val2 = function_name(args);
auto val3 = object_name(args);


Да, пропустил. ))

SashaMercuryНо как на создание экземпляра может повлиять T_L?
Никак. Но при присвоении, в зависимости от задействованных типов, может еще вызваться оператор конверсии типа и оператор присвоения.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291229
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, я узнал много нового. Нужно более плотно читать книги по С++, благо они у меня есть( Меня гонят спать. Всем хороших выходных C:
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299124
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переписал одну функцию, для расчёта динамики частного процесса. В качестве структуры данных использовал последовательный контейнер vector. Пока вижу одни плюсы, очень удобно и лично я пока очень доволен. Неужели нет никаких подводных камней и всё должно быть так просто? Не нужно в разных местах кода добавлять блоки отвечающие за освобождение памяти, код становится читабельней. И при этом, возможность обратиться к элементу вектора как к элементу массива сохранилась. Но самое главное, код стал читабельней и его размер уменьшился. И теперь я не боюсь что забуду освободить память. Но всё-таки, за всё нужно платить, должны быть минусы
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299168
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНо всё-таки, за всё нужно платить, должны быть минусы
Минусы проявляются в режиме отладки, когда отключена оптимизация и код не инлайнится - работает медленнее т.к. [] в этом случае - дополнительный вызов функции.
А в стандартном режиме, никаких минусов,в по сравнению с массивом созданным через malloc, нет.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299173
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подводный камень - в интеграции. Чем дальше ты уходишь от С к С++ c STL тем
сложнее тебе сделать callback твоей функции из Java (к примеру). Возможно я это
говорю не к времени и не к месту но это тоже недостаток который при проектировании
нужно знать и учитывать.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299184
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПодводный камень - в интеграции. Чем дальше ты уходишь от С к С++ c STL тем
сложнее тебе сделать callback твоей функции из Java (к примеру).
JNI обертки можно компилировать как С так и С++. Стыдно не знать )))
Поэтому никакой практической разницы конкретно в этом вопросе нет.

Если же говорить вообще, то написание С-оберток к С++ классам настолько тривиально, что это - небольшой оверхед по сравнению с теми объемами отладки которые снимаются с программиста в результате того что ему не нужно думать об управлении памятью.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299188
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, у нас разговор идет в контексте std::vector.

Верно?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299191
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAnatoly Moskovsky, у нас разговор идет в контексте std::vector.

Верно?
Верно. Конкретно между vector и просто буфером нет никакой практической разницы. Потому что vector это и есть буфер + автоматическое удаление.
Если вы например хотите доступ к буферу из ЯП который поддерживает только С АПИ, то код оберток будет практически совпадать один в один что для С что для С++.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299202
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, ну представь что Саша закодил некое ПО активно используя std::vector
как базовую единицу для callbacks. Он передает и принимает аргументы в этом шаблоне.
Далее я. Заметя что это ПО замечательное, и мне очень нужно я хочу его в своё
приложение интегрировать. Моё приложение написано на Java.

И дальше я весь превратился в слух и ожидаю от Анатолия различных лайф-хаков
или хитростей как мне дальше быть.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299204
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Я же написал. Разницы между интерфейсным кодом с буфером и с вектором практически не будет.
Поэтому никаких дополнительных хаков из-за того, что это вектор, не надо.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299235
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, vector<> это просто массив, все его подводные камни это перемещение в памяти при увеличении в размере.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299238
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как вам такая библиотечка для Си?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299246
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)а как вам такая библиотечка для Си?
Как остроумный прикол - сойдет ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299252
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно. Пускай Саша даст больше сведений и тогда я разовью мысль.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299284
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЛадно. Пускай Саша даст больше сведений и тогда я разовью мысль.

Да какие там сведения. У мне была функция, алгоритм которой является в целом классическим случаем динамического программирования. Необходимо было создать динамический массив, из функции можно было выйти в разных точках, соответственно в каждой точке я должен был дублировать освобождение памяти. Кроме того, размер массива не был известен мне заранее, т.о. мне необходимо было использовать либо realloc либо аналог из С++/STD(без STD, видимо вызывать new с повторным копированием). Кроме того, необходимо было постоянно сопровождать размер массива. Перечисленные факторы приводят к тому, что мне труднее анализировать сам алгоритм, я отвлекаюсь на побочные факторы. Потому я решил открыть стандарт и BS в местах, которые посвящены контейнерам и прочитать информацию о vector конкретно. И использовал его.


PS
Кроме того, использование компаратора в функции сортировки просто шикарная идея, я конечно это и в Си делал(передавал указатель на функцию в качестве параметра другой функции), но очень здорово, что это сделано на уровне языка.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299335
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неудобно только чтение данных из какого-либо потока в vector. Вероятно для таких задач в С++ также существует какой-то стандартный механизм, но пока я не дошел до него. Делаю примерно следующим образом, но это через одно место называется

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        std::map<std::vector<int>, int> tmpts;
 	for (int i = 0; i < m; ++i) {
		std::vector<int> v_cur;
		int i_cur;
		in >> i_cur;
		for (int j = 0; j < l; ++j) {
			v_cur.push_back(0);
			in >> v_cur[j];
		}
		tmpts[v_cur] = i_cur;
	}
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299349
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
см. istream_iterator и back_inserter, но вполне можно обойтись и
Код: plaintext
1.
2.
3.
4.
v_cur.resize(l);
for(int& t : v_cur) {
  in >> t;
}
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299363
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wstсм. istream_iterator и back_inserter, но вполне можно обойтись и
Код: plaintext
1.
2.
3.
4.
v_cur.resize(l);
for(int& t : v_cur) {
  in >> t;
}



Тоже некрасиво, было бы здорово вообще инкапсулировать циклы. Позже посмотрю ссылки.

Спасибо всем за ваши мнения о контейнер vector :)
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39299387
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryТоже некрасиво, было бы здорово вообще инкапсулировать циклы.напиши функцию/класс для циклов
...
Рейтинг: 0 / 0
422 сообщений из 422, показаны все 17 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Различные структуры данных. Реализация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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