С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/55: Рейтинг темы: голосов - 55, средняя оценка - 4.51
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

Создание объекта std::set

21.11.2010, 17:37. Показов 11633. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
http://www.cplusplus.com/reference/stl/set/set/
Вот официальный сайт, по-моему.
И вот там такие конструкторы:

C++
1
2
3
4
5
6
7
8
explicit set ( const Compare& comp = Compare(),
               const Allocator& = Allocator() );
 
template <class InputIterator>
  set ( InputIterator first, InputIterator last,
        const Compare& comp = Compare(), const Allocator& = Allocator() );
 
set ( const set<Key,Compare,Allocator>& x );
И везде какие-то параметры, но есть.

И ниже пример создания множества.
C++
1
set<int> first;
Без единого параметра.
Как это понять? СПасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2010, 17:37
Ответы с готовыми решениями:

Как обратиться к последнему элементу std::set, не заводя цикл?
Есть set &lt;string&gt; Rasbienia; set заполняется в программе некоторыми элементами. Как обратиться к последнему элементу set, не заводя цикл....

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

"range-base for" и проверка на последний элемент в std::set<std::string>
Добрый день. Голова совсем не варит. Как мне организовать простую проверку на послений элемент без введения счетчика а просто сравнивая...

11
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.11.2010, 17:53
kravam,
C++
1
2
explicit set ( const Compare& comp = Compare(),
               const Allocator& = Allocator() );
Конструктор с двумя аргументами, заданными по умолчанию. Поэтому мы можем спокойно создать объект типа set с дефолтным предикатом сравнения и дефолтным аллокатором.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
21.11.2010, 17:53
Ну-с, во-первых, говорить об "официальном сайте STL", по-моему, несколько.... эээ..... опрометчиво, скажем так. К тому же, если бы такой официальный сайт существовал бы, он явно был бы не русскоязычным.
Учти еще, что даже реализаций STL существует несколько! Стандарт языка устанавливает требования только к интерфейсу библиотеки. И если б такой сайт существовал - какую именно из реализаций он бы описывал??

Вот этот конструктор
C++
1
2
explicit set ( const Compare& comp = Compare(),
               const Allocator& = Allocator() );
имеет все параметры по умолчанию, и, таким образом, является дефолтным. Вот он и используется.
1
21.11.2010, 18:26

Не по теме:

Цитата Сообщение от CheshireCat Посмотреть сообщение
К тому же, если бы такой официальный сайт существовал бы, он явно был бы не русскоязычным.
а где там русский язык? :D

0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
21.11.2010, 19:09  [ТС]
ForEveR,
CheshireCat, а теперь вопрос: а почему вы решили что этот конструктор и есть конструктор по умолчанию?
Вот я попытался найти ответ сам. У Павловской ("C/C++ ПРограммирование на языке высокго уровня") есть такой пример: класс monstr и три таких конструктора:
monstr (int he= 100, int am= 10);
monstr (color= sk)
monstr (char*= name)

И написано, что первый является конструктором по умолчанию, поскольку его можно вызвать без параметров. И из чего это следует? Из того, что там два параметра типа int? ТАк я могу такой вот конструкто приписать ещё. четвёртый (здесь он по счёту второй):
C++
1
2
3
4
monstr (int he= 100, int am= 10);
 monstr (int he= 100, int am= 10, int a= 300);
 monstr (color= sk)
 monstr (char*= name)
Так, имеет два конструктора,которые можно вызвать без параметров. Какой из них является конструктором по умолчанию- неизвестно.

У Стивена Прата просто опущен этот вопрос. Кстати, многие авторы отводят конструкторам по умолчанию целую главу, в которой пишут как создать конструктор по умолчанию- конструктор без аргументов. И всё на этом.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.11.2010, 20:12
kravam, Тут очевидно что у set именно этот конструктор используется при создании объекта.
C++
1
std::set<int> Ob;
Хотя бы потому, что других конструкторов, чтобы все параметры были по умолчанию просто нету.

Ну и так. Между прочим. MSVS.
C++
1
2
3
4
    set()
        : _Mybase(key_compare(), allocator_type())
        {   // construct empty set from defaults
        }
Пустой конструктор самого set который посылает в базовый класс дефолтные параметры класса сравнения и аллокатора
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
21.11.2010, 20:28  [ТС]
Да, так. Вот здесь я нашёл:
[10.4] Всегда ли конструктор по умолчанию для Fred выглядит как Fred::Fred()? Нет. Конструктор по умолчанию - это конструктор, который можно вызывать без аргументов. Таким образом, конструктор без аргументов безусловно является конструктором по умолчанию:
class Fred {
public:
Fred(); // Конструктор по умолчанию: может вызываться без аргументов
// ...
};
Однако возможно (и даже вероятно), что конструктор по умолчанию может принимать аргументы, при условии что для всех них заданы значения по умолчанию:
class Fred {
public:
Fred(int i=3, int j=5); // Конструктор по умолчанию: может вызываться без аргументов
// ...
};
Так, ладно. Теперь идём дальше. Вижу такой код:
C++
1
set<int, less<int> > S
И задаюсь вопросом: какой из трёх конструктров вызывается?
C++
1
2
3
4
5
6
explicit set ( const Compare& comp = Compare(),
               const Allocator& = Allocator() );
template <class InputIterator>
  set ( InputIterator first, InputIterator last,
        const Compare& comp = Compare(), const Allocator& = Allocator() );
set ( const set<Key,Compare,Allocator>& x );
Третий уонструктор отметаю сразу, ибо там один аргумент. Второй теоретически может вызываться, если допустить, что set- функция с неопределённым количеством аргументов. Но тогда получется, что тип int должен соответсвовать переменной first, а она указатель (во вторым аргументом то же самое)

В общем по количеству аргументов более всего подходит опять же, первый конструктор.
НО опять чушь. У меня первый аргумент типа int, а в конструкторе CompareВ общем, чтобы не гадать на кофейной гуще опять хочу спросить, а щас какой конструктор вызывается? Или в моём компе другая реализация STL, отличная от представленной?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.11.2010, 20:44
kravam, Не так все просто.
Как ни странно вызывается конструктор по умолчанию (в MSVS).
Но он не совсем конструктор по умолчанию ибо класс все же шаблонный.
Шаблон класса set выглядит так:
C++
1
2
3
4
template<class _Kty,
    class _Pr = less<_Kty>,
    class _Alloc = allocator<_Kty> >
    class set
То есть как видно все кроме типа аргумента - шаблон по умолчанию.

Далее. При написании
C++
1
std::set<int, std::less<int> > S;
Вызывается конструктор
C++
1
2
3
4
    set()
        : _Mybase(key_compare(), allocator_type())
        {   // construct empty set from defaults
        }
Где - key_compare есть переданный шаблон std::less<int>, а аллокатор используется по дефолту.

Добавлено через 5 минут
Из этого конструктора вызывается такой конструктор. Где:
_Parg - значение вернувшееся key_compare() (в нашем случае less<int>), Al - аллокатор (в данном случае по умолчанию).

C++
1
2
3
4
5
6
    explicit _Tree(const key_compare& _Parg,
        const allocator_type& _Al)
        : _Mybase(_Parg, _Al)
        {   // construct empty tree
        _Init();
        }
Добавлено через 3 минуты
При создании объекта допустим таким образом.

C++
1
2
    int Arr[]={5,4,3,2,1};
    std::set<int, std::less<int> > S(Arr, Arr+sizeof(Arr)/sizeof(*Arr));
вызовется
C++
1
2
3
4
5
6
7
8
    template<class _Iter>
        set(_Iter _First, _Iter _Last)
        : _Mybase(key_compare(), allocator_type())
        {   // construct set from [_First, _Last), defaults
        _DEBUG_RANGE(_First, _Last);
        for (; _First != _Last; ++_First)
            this->insert(*_First);
        }
Вот этот конструктор. Где соответственно итераторы - начало, конец последовательности, key_compare() возвращает переданный ШАБЛОННЫЙ тип, ну и аллокатор.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
21.11.2010, 23:26  [ТС]
я мало чё понял. потом вернусь сюда ещё, спасибо всё равно
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.11.2010, 00:28
kravam, При перемене template-ных параметров - не будет вызываться другой конструктор. Другой конструктор будет вызываться только в том случае, если это указано явно в параметрах конструктора. Пример.

C++
1
std::vector<int>(5);
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
22.11.2010, 20:28  [ТС]
я настолько жидко облажался в сообщении номер 7, что аж самому стыдно.
Писал:
C++
1
set<int, less<int> > S
и спрашивал, какой из конструкторов вызывается. Но я не так спрашивал: какому из нижеперечисленных конструкторов соответствует это выражение
S()
C++
1
2
3
4
5
6
 explicit set ( const Compare& comp = Compare(),
               const Allocator& = Allocator() );
template <class InputIterator>
  set ( InputIterator first, InputIterator last,
        const Compare& comp = Compare(), const Allocator& = Allocator() );
set ( const set<Key,Compare,Allocator>& x );
А я спрашивал так (может, я плохо объяснял но именно это я и имел ввиду):
какому из конструкторов соответсвует ЭТО выражение
C++
1
set<int, less<int> >
А меж тем их в соответствие друг другу вообще нельзя ставить! Параметры шаблона есть параметры шаблона, а параметры конструкторов есть параметры конструкторов.
Вот я подумал на досуге и понял чё ИМЕННО я не понял. Опыта вообще не хватает.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.11.2010, 20:59
kravam, Ну да. Параметры шаблона не меняют вызов конструктора. А вот если мы сделаем так.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <set>
#include <functional>
 
bool foo(int t, int z)
{
    return t>z;
}
 
int main()
{
    bool(*fp)(int, int)=foo;
    std::set<int, bool(*)(int, int)> St(fp);
}
То вызовется вот этот конструктор.
C++
1
2
3
4
    explicit set(const key_compare& _Pred)
        : _Mybase(_Pred, allocator_type())
        {   // construct empty set from comparator
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.11.2010, 20:59
Помогаю со студенческими работами здесь

Операция std::cout для Объекта типа std::string
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор &quot;&lt;&lt;&quot;, соответствующий этим операндам&quot; ...

Std::set проглатывает std::string{"b"}
Олимпиадное задание. Мультиклавиатура — это обычная клавиатура с множеством выходов, каждый из которых можно подключить к одному...

Инициализация std::set
Как наиболее грамотно инициализировать std::set &lt;std::pair &lt;std::string, std::string&gt; &gt; значениями, переданными в программу через аргумент...

итераторами для std::set
Здравствуйте! Разбирая std::set и его итераторы столкнунлась с ужасающей проблемой: когда передаю итератор в качестве параметра...

Конструктор для std::set
struct TrainFilterCompany { TrainFilterCompany ( const set&lt;string&gt; &amp; companies ) : m_Companies ( companies ) { } bool...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru