Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 63, средняя оценка - 4.67
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,340
#1

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

21.11.2010, 17:37. Просмотров 7874. Ответов 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;
Без единого параметра.
Как это понять? СПасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
21.11.2010, 17:53     Создание объекта std::set #2
kravam,
C++
1
2
explicit set ( const Compare& comp = Compare(),
               const Allocator& = Allocator() );
Конструктор с двумя аргументами, заданными по умолчанию. Поэтому мы можем спокойно создать объект типа set с дефолтным предикатом сравнения и дефолтным аллокатором.
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
21.11.2010, 17:53     Создание объекта std::set #3
Ну-с, во-первых, говорить об "официальном сайте STL", по-моему, несколько.... эээ..... опрометчиво, скажем так. К тому же, если бы такой официальный сайт существовал бы, он явно был бы не русскоязычным.
Учти еще, что даже реализаций STL существует несколько! Стандарт языка устанавливает требования только к интерфейсу библиотеки. И если б такой сайт существовал - какую именно из реализаций он бы описывал??

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

Не по теме:

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

kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,340
21.11.2010, 19:09  [ТС]     Создание объекта std::set #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)
Так, имеет два конструктора,которые можно вызвать без параметров. Какой из них является конструктором по умолчанию- неизвестно.

У Стивена Прата просто опущен этот вопрос. Кстати, многие авторы отводят конструкторам по умолчанию целую главу, в которой пишут как создать конструктор по умолчанию- конструктор без аргументов. И всё на этом.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
21.11.2010, 20:12     Создание объекта std::set #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 который посылает в базовый класс дефолтные параметры класса сравнения и аллокатора
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,340
21.11.2010, 20:28  [ТС]     Создание объекта std::set #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, отличная от представленной?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
21.11.2010, 20:44     Создание объекта std::set #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() возвращает переданный ШАБЛОННЫЙ тип, ну и аллокатор.
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,340
21.11.2010, 23:26  [ТС]     Создание объекта std::set #9
я мало чё понял. потом вернусь сюда ещё, спасибо всё равно
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
22.11.2010, 00:28     Создание объекта std::set #10
kravam, При перемене template-ных параметров - не будет вызываться другой конструктор. Другой конструктор будет вызываться только в том случае, если это указано явно в параметрах конструктора. Пример.

C++
1
std::vector<int>(5);
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,340
22.11.2010, 20:28  [ТС]     Создание объекта std::set #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> >
А меж тем их в соответствие друг другу вообще нельзя ставить! Параметры шаблона есть параметры шаблона, а параметры конструкторов есть параметры конструкторов.
Вот я подумал на досуге и понял чё ИМЕННО я не понял. Опыта вообще не хватает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2010, 20:59     Создание объекта std::set
Еще ссылки по теме:

C++ Чтение бинарного файла в поток std::ifstream и вывод в другой бинарный файл std::ofstream (создание копии)
C++ Конструктор для std::set
Операция std::cout для Объекта типа std::string C++
C++ Какие методы и перегруженные операторы поддерживает std::set?
Как заставить std::set хранить объекты пользовательского типа? C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
22.11.2010, 20:59     Создание объекта std::set #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
        }
Yandex
Объявления
22.11.2010, 20:59     Создание объекта std::set
Ответ Создать тему
Опции темы

Текущее время: 19:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru