vector всегда держит свои элементы в куче, а array — в себе. Второе быстрее, но не размер не просто нельзя меня, а он вообще должен быть задан на этапе компиляции.
Берём сей исходник, компиляем, меняем закомменченную строчку и компиляем ещё раз. Запускаем — видим ответ на второй вопрос. Запускаем под валгриндом в режимах memcheck и callgrind, сравниваем циферки и видим подтверждение, что array таки круче (но можно написать другой тест и результат будет обратный). А уж почему — на всё воля (подставить по вкусу)!
я тебе говорил за то что вектор копирует «в себя» эелементы, аррай я думаю этого не делает.
можешь попробовать создать объект такого и класа и впихнуть в вектор
class test {
test(const test& rhs)=delete;
int param;
public:
test(int i=0):param(i){}
};
Он тебя пошлет, т.к. нет явно конструктора ни с rv ни с uvr.
Где мы его видим? :)
Камрад, класс в себе ничего хранить не может.
Ты создаешь объект array на стеке - он будет хранить данные на стеке, а будешь создашь на куче - будет хранить на куче.
А я не на экзамене, чтоб выдавать полные ответы. Впрочем, ты тут всё равно не за ответами, проходи мимо.
А зачем тогда тут вообще что-то писать? Это не экзамен, а способ отличить сетевого тролля от разбирающегося в предмете человека. Если человек не в состоянии ответить на вопрос «почему», вместо ответа советует брать какие-то сорцы, но при этом даже не может объяснить какой результат он ожидает и зачем нам производить эти действия (никто же не спорит что массивы быстрее) - то такой человек просто редкий экземпляр пятизвёздочного выдержанного тролля.
#include <array>
#include <iostream>
using namespace std;
template<typename T>
void foo1( T a ) {
cout << "Size: " << a.size() << endl;
for( auto it : a )
cout << it << endl;
};
void foo2( array<int,4> a ) {
cout << "Size: must be 4" << endl;
for( int it : a )
cout << it << endl;
};
int main() {
array<int,5> a = { 1,2,3,4,5 };
foo1( a );
foo2( a );
}
И вектор и массив хранят данные по значению, какими данными их инициализировали - то они и хранят. Т.е. вторую часть твоего высказывания выбрасываем за бессмысленностью, что делает его в два раза проще. Воббще предлагаю такую формулировку: вектор не может быть быстрее массива потому что требует дополнительного разыменования ссылки при каждом обращении к элементу.
sizeof же вполне может разобраться с размерами. И потом можно же так сделать:
template <typename T, int N>
T max(const T (&vec)[N])
{
Q_ASSERT(N > 0);
T t = vec[0];
for (int i = 1; i != N; i++) {
t = max(t, vec[i]);
}
return t;
}