LINUX.ORG.RU

Вектор можно уменьшить/увеличить

aptyp ★★★★
()

если речь идет о std::vector, то на него накладывается все то, что применимо к stl контейнерам.

в общем сравнение уровня «чем отличается класс smth от int?»

v0rbis ★★
()
Последнее исправление: v0rbis (всего исправлений: 1)

vector всегда держит свои элементы в куче, а array — в себе. Второе быстрее, но не размер не просто нельзя меня, а он вообще должен быть задан на этапе компиляции.

const86 ★★★★★
()
Ответ на: комментарий от const86

Такая фиговина вроде же только в бусте была. Уже в стандарт перетащили?

imtw
()
Ответ на: комментарий от anonymous

Не знаю. Я с array никогда не работал, просто помню, что в бусте была такая штуковина.

imtw
()
Ответ на: комментарий от Boy_from_Jungle

Для тебя же именно это было критерием удобности, но ты почему-то считаешь vector более удобным. ;)

anonymous
()

Может быть меньше на php писать нужно?

anonymous
()
Ответ на: комментарий от anonymous

Странно, написали, что код проверки не совпадает, а сообщение-то оказывается появилось...

anonymous
()
Ответ на: комментарий от anonymous

нет, я имел ввиду что он динамический и совместим с С-масивами.
а ты написал

array тоже можно вместо массивов подсовывать.

->array
->масив

угу.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Reset

за счет чего быстрее?

Тут лучше начать с вопроса: «где это в себе?»

Берём сей исходник, компиляем, меняем закомменченную строчку и компиляем ещё раз. Запускаем — видим ответ на второй вопрос. Запускаем под валгриндом в режимах memcheck и callgrind, сравниваем циферки и видим подтверждение, что array таки круче (но можно написать другой тест и результат будет обратный). А уж почему — на всё воля (подставить по вкусу)!

const86 ★★★★★
()
Ответ на: комментарий от anonymous

Это не ответ на заданные тебе вопросы, двоечник.

А я не на экзамене, чтоб выдавать полные ответы. Впрочем, ты тут всё равно не за ответами, проходи мимо.

const86 ★★★★★
()
Ответ на: комментарий от anonymous

Это не ответ на заданные тебе вопросы, двоечник.

Помоему здесь проще,
std::array не страдает как остальные контейнеры - «копирование на входе - копирование на выходе»

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

ты в релизной сборке проверял?!

Да, а откуда такой вопрос? Гонять неоптимизированное на callgrind мало смысла, а остальные результаты не отличаются.

const86 ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

std::array не страдает как остальные контейнеры - «копирование на входе - копирование на выходе»

на выходе ни у кого не было копирования, а на входе - читай про emplace и rvalue references в С++11

wota ★★
()
Ответ на: комментарий от Boy_from_Jungle

в тесте явно вызывается move-constructor ?

для array и vector там вызовется одинаковое кол-во конструкторов - по одному на элемент в контейнере

wota ★★
()
Ответ на: комментарий от wota

я тебе говорил за то что вектор копирует «в себя» эелементы, аррай я думаю этого не делает. можешь попробовать создать объект такого и класа и впихнуть в вектор

class test {
    test(const test& rhs)=delete;
    int param;
public:
    test(int i=0):param(i){}
};
Он тебя пошлет, т.к. нет явно конструктора ни с rv ни с uvr.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от const86

видим ответ на второй вопрос.

Где мы его видим? :) Камрад, класс в себе ничего хранить не может. Ты создаешь объект array на стеке - он будет хранить данные на стеке, а будешь создашь на куче - будет хранить на куче.

anonymous
()
Ответ на: комментарий от Boy_from_Jungle

я хз тогда почему array faster than vector

у него нет дополнительной аллокации/деаллокации в куче, выделить место на стеке (в данном примере) под элементы - быстрее

wota ★★
()
Ответ на: комментарий от Boy_from_Jungle

Вся разница тут в аллокации памяти. vector выделяет память динамически, а хранит указатель на нее. array хранит данные непосредственно, по значению.

anonymous
()
Ответ на: комментарий от const86

А я не на экзамене, чтоб выдавать полные ответы. Впрочем, ты тут всё равно не за ответами, проходи мимо.

А зачем тогда тут вообще что-то писать? Это не экзамен, а способ отличить сетевого тролля от разбирающегося в предмете человека. Если человек не в состоянии ответить на вопрос «почему», вместо ответа советует брать какие-то сорцы, но при этом даже не может объяснить какой результат он ожидает и зачем нам производить эти действия (никто же не спорит что массивы быстрее) - то такой человек просто редкий экземпляр пятизвёздочного выдержанного тролля.

anonymous
()
Ответ на: комментарий от anonymous

Вся разница тут в аллокации памяти. vector выделяет память динамически, а хранит указатель на нее. array хранит данные непосредственно, по значению.

Всё проще :)

anonymous
()
Ответ на: комментарий от Gorthauer

А чем оно круче сишных массивов?

#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 );
}
wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от anonymous

Куда уж проще-то? Ну расскажите.

И вектор и массив хранят данные по значению, какими данными их инициализировали - то они и хранят. Т.е. вторую часть твоего высказывания выбрасываем за бессмысленностью, что делает его в два раза проще. Воббще предлагаю такую формулировку: вектор не может быть быстрее массива потому что требует дополнительного разыменования ссылки при каждом обращении к элементу.

anonymous
()
Ответ на: комментарий от wota

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;
}

Gorthauer ★★★★★
()
Ответ на: комментарий от Gorthauer

sizeof же вполне может разобраться с размерами

sizeof для параметра вернет размер указателя

И потом можно же так сделать:

и самому себе отрубить руки возможность связать пару шаблонных функций без добавления в каждую N

wota ★★
()
Ответ на: комментарий от drBatty

std::vector и std::array их таки заменяет на более юзабельные аналоги.

У сишных массивов есть всё-таки одна мега фича - возможность не указывать размер.

DarkEld3r ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.