Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: [C++] динамический массив в классе  (Прочитано 31971 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 25-05-2010 07:02 » 

Алексей1153++, Вад, не понял чего вам не понравилось
А мне не не понравилось Улыбаюсь Это раз уж Лёша начал по-научному извращаться, то я свои пять копеек вставил.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #31 : 25-05-2010 07:16 » 

Таки что порекомендуете использовать вместо std::vector, когда нужен динамический массив?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #32 : 25-05-2010 07:55 » 

так можно и динамический массив. Но это возня с выделением и удалением в конструкторе/деструкторе и в других местах класса. А вектор объявил и почти забыл Улыбаюсь
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #33 : 25-05-2010 07:57 » 

RXL, я предпочитаю дек для хранения крупных объектов, а вектор в основном, как промежуточное хранилище для передачи по сети сложных объектов
вообще каждый случай индивидуален, поэтому ....
вектор я не люблю использовать из повышенных требований к наличию непрерывного блока памяти, когда у тебя данных сотни мегабайт, это может быть важно
push_back приводит к реалокациям, а реалокация на фоне new в соседнем потоке фрагментирует память
вообще, я его недолюбливаю из-за особенностей моей работы, а не от того что он весь такой плохой
просто мне он неподходит
Записан

Странно всё это....
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #34 : 25-05-2010 08:06 » 

Цитата
push_back приводит к реалокациям,
так push_back использовать необязательно же, можно работать как с обычным массивом, зарезервировав память заранее
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #35 : 25-05-2010 09:54 » 

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

Странно всё это....
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #36 : 25-05-2010 10:03 » 

LogRus, ну это как раз уже то, что "другая задача"
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #37 : 25-05-2010 10:33 » 

Код:
selectedWorkers.erase(std::find(selectedWorkers.begin(), selectedWorkers.end(), key));

Здесь selectedWorkers представляет собой std::CONTAINER<int>. Задача - удалить элемент со значением key из списка.

Попробовал заменить CONTAINER c vector на deque и получил ошибку компиляции:

Цитата
template argument _InputIter passed to 'find' is a output iterator: input iterator required

Не пойму, что я тут не так сделал... Вроде как deque имеет тот же интерфейс, что и vector, но немного расширенный для работы с началом списка.

UPD: отбой - это предупреждения, а не ошибки. Видимо в BCB6 кривая реализация STL.
« Последнее редактирование: 25-05-2010 11:34 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #38 : 25-05-2010 11:06 » 

Код:
#include <deque>
#include <algorithm>

std::deque<int> selectedWorkers;

selectedWorkers.erase(std::find(selectedWorkers.begin(), selectedWorkers.end(), 7));


а у меня скомпилировалось
Записан

Rustam
Гость
« Ответ #39 : 25-05-2010 11:09 » 

не отходите далеко от темы ребята =)
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #40 : 25-05-2010 11:14 » 

RXL, что за компилятор и STL?

если тебе нужно добавлять и удалять числа, то может просто использовать set?
Записан

Странно всё это....
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #41 : 25-05-2010 11:14 » 

Rustam, ну проблему решили можно и поболтать Улыбаюсь
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #42 : 25-05-2010 11:35 » 

LogRus, не, мне нужен упорядоченный список. Выше я написал - это оказалось некритичным предупреждением. Сейчас попробую, как работает.

Замена vector на deque у меня работает.
« Последнее редактирование: 25-05-2010 11:37 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #43 : 25-05-2010 12:07 » 

LogRus, не, мне нужен упорядоченный список. Выше я написал - это оказалось некритичным предупреждением. Сейчас попробую, как работает.

Замена vector на deque у меня работает.

ну у меня предупреждений
а кто сказал, что set нельзя как упорядоченный список использовать? Улыбаюсь
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #44 : 25-05-2010 13:58 » 

LogRus, пока не вижу в описании std::set, что это упорядоченный список...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #45 : 25-05-2010 16:37 » 

Код:
std::set<int> s;
for(std::set<int>::iterator it=s.begin(); it != s.end(); ++it)
{
   ................
}

так вот: итератор возвращает элементы в порядке возрастания
чем не список? Улыбаюсь

пример: http://cplusplus.com/reference/stl/set/begin/
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #46 : 25-05-2010 16:41 » 

Наверно я не так выразился: под упорядоченным я имел в виду не сортированный, а в порядке помещения элементов в контейнер. Ассоциативные контейнеры не могут обеспечить тот же порядок без дополнительной поддержки.
« Последнее редактирование: 25-05-2010 16:43 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #47 : 25-05-2010 17:08 » 

стоп, если он не отсортированный, то код не рабочий
Код:
selectedWorkers.erase(std::find(selectedWorkers.begin(), selectedWorkers.end(), 7));
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #48 : 25-05-2010 17:16 » 

С чего бы он вдруг стал нерабочий?

1. std::find(selectedWorkers.begin(), selectedWorkers.end(), 7)
Возвращает итератор, указывающий на элемент со значением 7.

2. selectedWorkers.erase(.....)
Удаляет элемент по итератору.

Все согласно спецификации STL для последовательных контейнеров.
Кстати, работает.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #49 : 25-05-2010 17:34 » 

потому, что find работает, только с отсортированными диапазонами
Записан

Странно всё это....
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #50 : 25-05-2010 17:37 » 

а нет гоню, find работает любых массивах т.к. он использует простой перебор элементов, что ИМХО ацтой, хотя задачи бывают разные Улыбаюсь
Записан

Странно всё это....
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #51 : 25-05-2010 17:44 » 

LogRus, хм, вот только хотел написать, что с вполне неупорядоченным вектором find работает ))
« Последнее редактирование: 25-05-2010 17:49 от Алексей1153++ » Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #52 : 25-05-2010 17:45 » 

давно не пользовался, всё больше индексы и ассоциативные контейнеры, уже и забыл про простой перебор
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #53 : 25-05-2010 18:07 » 

Пока я тут читал доки, вы уже разобрались...
Но, все же, чтобы добру не пропадать привожу тест.

Код:
#include <stdio.h>
#include <vector>
#include <algorithm>

typedef std::vector<int> list_int_t;

void print_list(list_int_t &list)
{
    list_int_t::iterator it;

    for (it = list.begin(); it != list.end(); it++)
        printf("%d ", *it);

    puts("");
}

int main()
{
    list_int_t list;

    // Заполняем список.
    list.push_back(5);
    list.push_back(4);
    list.push_back(3);
    list.push_back(7);
    list.push_back(2);
    list.push_back(8);
    list.push_back(1);
    list.push_back(7);

    // Выводим начальное состояние списка.
    puts("Вывод содержимого списка (1)");
    print_list(list);

    // Удаляем элемент со значением 7.
    list.erase(find(list.begin(), list.end(), 7));

    // Выводим конечное состояние списка.
    puts("Вывод содержимого списка (2)");
    print_list(list);

    return 0;
}

Код:
$ g++ -Wall -o t2 t2.cpp
$ ./t2

Код:
Вывод содержимого списка (1)
5 4 3 7 2 8 1 7
Вывод содержимого списка (2)
5 4 3 2 8 1 7



У меня под рукой книженция "STL. Карманный справочник." (ISBN 5-469-00389-2):

Цитата
Некоторое количество алгоритмов требует отсортированных интервалов или иначе использует функции сравнения для проверки отношений «меньше». ...

Не знаю, может это имеет отношение к нашему вопросу...
« Последнее редактирование: 25-05-2010 18:15 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #54 : 25-05-2010 18:17 » 

Я тоже предпочитаю map, но если нет уникального ключа или нужен определенный порядок хранения, то использую vector (теперь уже deque).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #55 : 25-05-2010 18:21 » 

Я тоже предпочитаю map, но если нет уникального ключа или нужен определенный порядок хранения, то использую vector (теперь уже deque).
Для таких случаев есть multiset и multimap, не требующие уникального ключа.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #56 : 25-05-2010 18:29 » 

Но с ними не так удобно работать, как с map и vector. Затрудняюсь найти им применение в своей практике.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #57 : 25-05-2010 18:36 » 

я multimap применял, когда в качестве ключа использовалось время. Могло повторяться )
Записан

Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines