Тупой вопрос про std::vector
От: Trinity-2001 Россия  
Дата: 05.04.11 10:29
Оценка:
Привет всем!
Вопрос такой — если создавать вектор так:

vector<int> v(5, 8);


то создастся вектор из пяти элементов, и все они равны 8.

А если создавать так:

vector<int> v(5);


то там будет 5 элементов, но чему они будут равны?

VS 2008 выводит, что все равные 0, но всегда ли так?

Сорри, вопрос, наверное, глупый, но вот читаю книгу, и там не написано точно.
Re: Тупой вопрос про std::vector
От: XuMuK Россия  
Дата: 05.04.11 10:32
Оценка: 2 (1)
Здравствуйте, Trinity-2001, Вы писали:

T2>Привет всем!

T2>Вопрос такой — если создавать вектор так:

T2>
T2>vector<int> v(5, 8);
T2>


T2>то создастся вектор из пяти элементов, и все они равны 8.


T2>А если создавать так:


T2>
T2>vector<int> v(5);
T2>


T2>то там будет 5 элементов, но чему они будут равны?


T2>VS 2008 выводит, что все равные 0, но всегда ли так?


T2>Сорри, вопрос, наверное, глупый, но вот читаю книгу, и там не написано точно.


да, всегда.
во втором случае для каждого элемента вызовется конструктор по-умолчанию, для int он инициализирует элемент нулем.
Re: Тупой вопрос про std::vector
От: uzhas Ниоткуда  
Дата: 05.04.11 10:32
Оценка: 2 (1)
Здравствуйте, Trinity-2001, Вы писали:

T2>VS 2008 выводит, что все равные 0, но всегда ли так?


все будут равны 0 (согласно стандарту), потому что вы вызывается выделенный конструктор

// 23.2.4.1 construct/copy/destroy:
explicit vector(const Allocator& = Allocator());

explicit vector(size_type n, const T& value = T(),
const Allocator& = Allocator());


template <class InputIterator>
vector(InputIterator first, InputIterator last,
const Allocator& = Allocator());

vector(const vector<T,Allocator>& x);

Re[2]: Тупой вопрос про std::vector
От: Lorenzo_LAMAS  
Дата: 05.04.11 13:13
Оценка: +5 -2
XMK>да, всегда.
XMK>во втором случае для каждого элемента вызовется конструктор по-умолчанию, для int он инициализирует элемент нулем.

У встроенного типа int нет конструкторов по умолчанию (и вообще нет конструкторов). не надо человека запутывать.
Of course, the code must be complete enough to compile and link.
Re[2]: Тупой вопрос про std::vector
От: Roman Odaisky Украина  
Дата: 05.04.11 17:37
Оценка:
Здравствуйте, uzhas, Вы писали:

U>все будут равны 0 (согласно стандарту), потому что вы вызывается выделенный конструктор

U>

U>// 23.2.4.1 construct/copy/destroy:
U>explicit vector(const Allocator& = Allocator());

U>explicit vector(size_type n, const T& value = T(),
U> const Allocator& = Allocator());


U>template <class InputIterator>
U>vector(InputIterator first, InputIterator last,
U> const Allocator& = Allocator());

U>vector(const vector<T,Allocator>& x);


А если уж совсем согласно, то std::vector<int> v(5, 8) вызовет вовсе не выделенный конструктор и не скомпилируется (баг стандарта).
До последнего не верил в пирамиду Лебедева.
Re[3]: Тупой вопрос про std::vector
От: XJess  
Дата: 06.04.11 10:53
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

U>>все будут равны 0 (согласно стандарту), потому что вы вызывается выделенный конструктор

U>>

U>>// 23.2.4.1 construct/copy/destroy:
U>>explicit vector(const Allocator& = Allocator());

U>>explicit vector(size_type n, const T& value = T(),
U>> const Allocator& = Allocator());


U>>template <class InputIterator>
U>>vector(InputIterator first, InputIterator last,
U>> const Allocator& = Allocator());

U>>vector(const vector<T,Allocator>& x);


RO>А если уж совсем согласно, то std::vector<int> v(5, 8) вызовет вовсе не выделенный конструктор и не скомпилируется (баг стандарта).


Погодите, а какой тогда он должен вызвать конструктор и почему не скомпилируется?
Re[3]: Тупой вопрос про std::vector
От: uzhas Ниоткуда  
Дата: 06.04.11 14:59
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>А если уж совсем согласно, то std::vector<int> v(5, 8) вызовет вовсе не выделенный конструктор и не скомпилируется (баг стандарта).

поясните почему код не должен скомпилироваться и в чем баг стандарта
Re[4]: Тупой вопрос про std::vector
От: Lorenzo_LAMAS  
Дата: 06.04.11 16:07
Оценка: +1
XJ>Погодите, а какой тогда он должен вызвать конструктор

template<class InputIterator>
vector(InputIterator first, InputIterator last, const Allocator & = Allocator());

На деле же, большинство реализаций достаточно умные, чтобы проверить, что им подсунули в качестве итераторов и, если это не итератор — вызвать нужную функцию для инициализации. Но вот, насколько помню, в VS 6 выдавало ошибку компиляции.
Of course, the code must be complete enough to compile and link.
Re[5]: Тупой вопрос про std::vector
От: Lorenzo_LAMAS  
Дата: 06.04.11 17:59
Оценка:
Собс-но, 23.1.1/9 (версия 2003 года)

— the constructor

template<class InputIterator>
X(InputIterator f, InputIterator l, const Allocator & a = Allocator())

shall have the same effect as:
X(static_cast<typename X::size_type>(f), static_cast<typename X::value_type>(l), a);

if InputIterator is an integral type

Of course, the code must be complete enough to compile and link.
Re[3]: Тупой вопрос про std::vector
От: Lorenzo_LAMAS  
Дата: 06.04.11 18:08
Оценка:
23.1.1/9 (версия 2003 года)

— the constructor

template<class InputIterator>
X(InputIterator f, InputIterator l, const Allocator & a = Allocator())

shall have the same effect as:
X(static_cast<typename X::size_type>(f), static_cast<typename X::value_type>(l), a);

if InputIterator is an integral type

Of course, the code must be complete enough to compile and link.
Re[6]: Тупой вопрос про std::vector
От: Lorenzo_LAMAS  
Дата: 06.04.11 18:15
Оценка: 4 (1)
L_L>

L_L>— the constructor

L_L>template<class InputIterator>
L_L>X(InputIterator f, InputIterator l, const Allocator & a = Allocator())

L_L>shall have the same effect as:
L_L>X(static_cast<typename X::size_type>(f), static_cast<typename X::value_type>(l), a);

L_L>if InputIterator is an integral type


А вообще и это хлам

438. Ambiguity in the "do the right thing" clause
http://open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html
Of course, the code must be complete enough to compile and link.
Re[5]: Тупой вопрос про std::vector
От: XJess  
Дата: 07.04.11 11:17
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>
L_L>template<class InputIterator>
L_L>vector(InputIterator first, InputIterator last, const Allocator & = Allocator());
L_L>

L_L>На деле же, большинство реализаций достаточно умные, чтобы проверить, что им подсунули в качестве итераторов и, если это не итератор — вызвать нужную функцию для инициализации. Но вот, насколько помню, в VS 6 выдавало ошибку компиляции.

А можно объяснить, почему должен вызваться этот конструктор вместо этого:

explicit vector(size_type n, const T& value = T(),
const Allocator& = Allocator());


Ведь второй лучше подходит?
Re[6]: Тупой вопрос про std::vector
От: Lorenzo_LAMAS  
Дата: 07.04.11 11:48
Оценка:
XJ>А можно объяснить, почему должен вызваться этот конструктор вместо этого:

XJ>
XJ>explicit vector(size_type n, const T& value = T(),
XJ>const Allocator& = Allocator());
XJ>


XJ>Ведь второй лучше подходит?


Кто из них второй?
Ну вот, читали читали Вандевурдов и Джосатисов, а такие вещи не знаем
Of course, the code must be complete enough to compile and link.
Re[3]: Тупой вопрос про std::vector
От: XJess  
Дата: 07.04.11 11:50
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

XMK>>во втором случае для каждого элемента вызовется конструктор по-умолчанию, для int он инициализирует элемент нулем.


L_L>У встроенного типа int нет конструкторов по умолчанию (и вообще нет конструкторов). не надо человека запутывать.


А как тогда называется запись int(), которое в VS вроде работает?
Re[7]: Тупой вопрос про std::vector
От: XJess  
Дата: 07.04.11 12:00
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

Первый:

template<class InputIterator>
vector(InputIterator first, InputIterator last, const Allocator & = Allocator());


Второй:

explicit vector(size_type n, const T& value = T(),
const Allocator& = Allocator());


А теперь можно без лишних распальцовок и унижений других людей объяснить, почему должен вызваться первый?
Re[8]: Тупой вопрос про std::vector
От: night beast СССР  
Дата: 07.04.11 12:11
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>А теперь можно без лишних распальцовок и унижений других людей объяснить, почему должен вызваться первый?


template<typename T>
void foo ( T x ) { std::cout << "first"; }

void foo ( size_t i ) { std::cout << "second"; }

int main()
{
    foo(1); 

    return 0;
}
Re[4]: Тупой вопрос про std::vector
От: uzhas Ниоткуда  
Дата: 07.04.11 14:30
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>А как тогда называется запись int(), которое в VS вроде работает?

это просто инициализация
можете еще деструктор поискать здесь: http://codepad.org/EZZYb8bD
Re[4]: Тупой вопрос про std::vector
От: Lorenzo_LAMAS  
Дата: 07.04.11 16:16
Оценка:
XJ>А как тогда называется запись int(), которое в VS вроде работает?

Эээ, это смотря где она. Одно дело такое void fun(int()); и другое дело такое int() + 2;
Во втором случае это explicit type conversion (functional notation):

5.2.3/2

The expression T(), where T is a simple-type-specifier (7.1.5.2) for a non-array complete object type or the (possibly cv-qualified) void type, creates an rvalue of the specified type, which is value-initialized ....


Соб-сно, ваш вопрос вообще не очень удачен, для случая MyClass().member_fun() (MyClass — определенный пользователем тип) MyClass() это тоже не вызов конструктора (хоть он и будет вызван).
Of course, the code must be complete enough to compile and link.
Re[6]: Тупой вопрос про std::vector
От: Roman Odaisky Украина  
Дата: 08.04.11 09:19
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>А можно объяснить, почему должен вызваться этот конструктор вместо этого:

XJ>Ведь второй лучше подходит?

Согласно 13.3.3/1 функция, не требующая неявных преобразований (в данном случае из int в size_t) предпочтительнее, даже если шаблонная. Компилятор-то не знает, что под InputIterator понимается не любой тип (ему можно было бы это втолковать с помощью концепций, но эту интересную фичу в новый C++ так и не включили).
До последнего не верил в пирамиду Лебедева.
Re[7]: Тупой вопрос про std::vector
От: Roman Odaisky Украина  
Дата: 08.04.11 09:36
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>А вообще и это хлам :)


L_L>438. Ambiguity in the "do the right thing" clause

L_L>http://open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html

А вот еще хламее:

1234. "Do the right thing" and NULL
http://open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html#1234
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.