Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/47: Рейтинг темы: голосов - 47, средняя оценка - 4.62
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
1

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

21.11.2010, 17:37. Просмотров 9706. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2010, 17:37
Ответы с готовыми решениями:

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

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

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

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

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

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

Не по теме:

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

0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
21.11.2010, 19:09  [ТС] 5
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
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
21.11.2010, 20:12 6
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
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
21.11.2010, 20:28  [ТС] 7
Да, так. Вот здесь я нашёл:
[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
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
21.11.2010, 20:44 8
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
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
21.11.2010, 23:26  [ТС] 9
я мало чё понял. потом вернусь сюда ещё, спасибо всё равно
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
22.11.2010, 00:28 10
kravam, При перемене template-ных параметров - не будет вызываться другой конструктор. Другой конструктор будет вызываться только в том случае, если это указано явно в параметрах конструктора. Пример.

C++
1
std::vector<int>(5);
1
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
22.11.2010, 20:28  [ТС] 11
я настолько жидко облажался в сообщении номер 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
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
22.11.2010, 20:59 12
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2010, 20:59

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

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 ) :...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.