С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 93
1

Переписать структуру со стандарта c++11 под более ранний

26.07.2017, 10:20. Показов 1080. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Господа, помогите разобраться. Есть вот такая структура:
C++ (Qt)
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
struct MedianFilter {
    unsigned k;
    unsigned blocks;
    unsigned n;
    unsigned half;
    unsigned result;
 
    MedianFilter(unsigned half_, unsigned blocks_) :
        k {2 * half_ + 1},
        blocks {blocks_},
        n {k * blocks_},
        half {half_},
        result {k * (blocks_ - 1) + 1}
    {
        if (half_ == 0) {
            throw std::invalid_argument("half-window size must be at least 1");
        }
        if (blocks_ == 0) {
            throw std::invalid_argument("number of blocks must be at least 1");
        }
        if (n / blocks != k) {
            throw std::overflow_error("input too large");
        }
    }
};
и вот такая
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct Buffer {
public:
    std::vector<std::pair<elem_t, unsigned>> sorted;
 
    explicit Buffer(MedianFilter f) :
        sorted(f.k),
        filter {f}
    {}
 
    void init(const elem_t* p) {
        for (unsigned i {0}; i < filter.k; ++i) {
            sorted[i] = std::make_pair(p[i], i);
        }
        std::sort(sorted.begin(), sorted.end());
    }
 
private:
    const MedianFilter filter;
};
не совсем могу понять что делают вот эти две строчки:
C++ (Qt)
1
2
sorted(f.k),
        filter {f}
и какой их аналог будет в 2003 стандарте.
Заранее огромное спасибо за помощь).
ЗЫ: elem_t определен в другом ашнике, с ним вроде все понятно.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2017, 10:20
Ответы с готовыми решениями:

Определить по дате, сегодняшний это день, вчерашний или более ранний
Всем привет! Ребят, подскажите, пожалуйста! Есть unix time. После конвертирования получаю дату...

Сайту более 5 лет. Оказался под фильтрами. Как вывести из-под фильтров.
Здравствуйте. Ситуация такова, что когда-то сайт был очень популярным и висел в топе по...

Переписать структуру на класс
Помогите,пожалуйста написать вот эту программу не через структуру,а через класс #include...

Переписать класс в структуру
Необходимо переписать класс через структуру. #include &quot;commun.h&quot; #include &lt;sstream&gt; ...

10
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
26.07.2017, 10:33 2
Лучший ответ Сообщение было отмечено Ilot как решение

Решение

1-я определяет размер будущего вектора, обращаясь к элементу k структуры MedianFilter.
2-я просто использует инициализацию фигурными скобками.
Цитата Сообщение от QuasiSimon Посмотреть сообщение
и какой их аналог будет в 2003 стандарте.
замените фигурные скобки на круглые.
1
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 93
26.07.2017, 10:41  [ТС] 3
Спасибо, это помогло). Но меня еще интересует как эти же строчки к примеру прописать в конструкторе, а не до него, чтобы было все эквивалентно.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
26.07.2017, 13:03 4
Цитата Сообщение от QuasiSimon Посмотреть сообщение
Но меня еще интересует как эти же строчки к примеру прописать в конструкторе, а не до него, чтобы было все эквивалентно.
Они и есть в конструкторе. Это список инициализации конструктора, он был и в С++98. Не надо ничего менять, с ним - правильно.
1
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 93
26.07.2017, 13:25  [ТС] 5
Видимо я неправильно выразился. Вот к примеру тут сделано так:
C++ (Qt)
1
2
3
MedianFilter(unsigned half_, unsigned blocks_) :
        k {2 * half_ + 1}
       {}
а можно сделать немного иначе(если я ничего не путаю):
C++ (Qt)
1
2
MedianFilter(unsigned half_, unsigned blocks_) 
        {k = 2 * half_ + 1;}
и работать оно будет аналогично. Вот меня и интересует, можно ли так сделать с filter (f)
0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
26.07.2017, 13:43 6
Цитата Сообщение от QuasiSimon Посмотреть сообщение
можно ли так сделать с filter (f)
нет.
потому что filter имеет квалификатор const.
1
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 93
26.07.2017, 13:50  [ТС] 7
Хорошо, а sorted(f.k)? Она уже не константа.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
26.07.2017, 13:50 8
Мы все прекрасно поняли, ответ прежний

Цитата Сообщение от QuasiSimon Посмотреть сообщение
и работать оно будет аналогично.
Только в случае простых типов. В случае наличия нетривиального конструктора по умолчанию, вначале будет вызыван он, а затем оператор присваивания.
Нужно отличать присваивание от иницилизации.
Еще раз: кроме отдельных редких случаев использовать список инициализации правильно, а присваивание в конструкторе - нет.
Кроме того, есть случаи, когда использовать присваивание в принципе не получится:
* член класса - ссылка;
* член класса - константа;
* член класса не имеет доступного оператора присваивания.
1
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
26.07.2017, 14:04 9
Цитата Сообщение от QuasiSimon Посмотреть сообщение
C++
1
2
3
4
5
6
MedianFilter(unsigned half_, unsigned blocks_) :
      k {2 * half_ + 1},
      blocks {blocks_},
      n {k * blocks_},
      half {half_},
      result {k * (blocks_ - 1) + 1}
C++
1
2
3
4
5
6
MedianFilter(unsigned half_, unsigned blocks_) :
      k (2 * half_ + 1),
      blocks (blocks_),
      n (k * blocks_),
      half (half_),
      result (k * (blocks_ - 1) + 1)
Фигурные скобки и в С++11 в первую очередь предназначены для инициализации массивов. Это просто для единообразия сделана доп. возможность инициализации членов класса и фигурными скобками тоже, а так по умолчанию - круглые скобки.
1
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 93
26.07.2017, 14:55  [ТС] 10
Уфффф. Спасибо большое всем, вроде понял, пошел мучить код).
0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
26.07.2017, 15:08 11
Цитата Сообщение от TRam_ Посмотреть сообщение
Фигурные скобки и в С++11 в первую очередь предназначены для инициализации массивов.
не-а.
http://www.open-std.org/jtc1/s... /n2672.htm

Добавлено через 15 секунд
Цитата Сообщение от TRam_ Посмотреть сообщение
Фигурные скобки и в С++11 в первую очередь предназначены для инициализации массивов.
не-а.
http://www.open-std.org/jtc1/s... /n2672.htm
0
26.07.2017, 15:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.07.2017, 15:08
Помогаю со студенческими работами здесь

Переписать готовую функцию более элегантно
Мое понимание элегантной функции: записано наиболее коротко, понятно, ничего лишнего, работает...

Ранний сброс hazard pointer
Вопрос к господам интересующимся lock-free структурами данных. Разбирал методику hazard pointer у...

Переписать код для более быстрой работы
Код должен собирать массивы такого вида: Array ( =&gt; Array ( =&gt; Array ( =&gt; 130 =&gt; 0 ) ...

Перенос файлов по расширению (более 500), сохраняя структуру каталогов
Добрый день. Скрипт должен перемещать файлы по расширению (больше 500) сохраняя структуру...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru