Я думаю о том, чтобы сделать структуру векторных данных более эффективной.Создание вектора более эффективно при добавлении элементов
Предположим, что это для некоторого общего типа данных T ... тогда, добавив новый элемент к вектору, то, что текущий std :: vector делает, - это перераспределить весь новый кусок памяти из n + 1 элементов.
Что я хочу сделать ...
Я написал небольшую программу:
#include<iostream>
using namespace std;
int main()
{
int *i,*j;
i=new int;
cout<<i;
delete i;
j=new int ;
cout<<j;
delete j;
return 0;
}
Оба места памяти были те же ...
Что теперь я имею в виду, что первый я буду выделять память для общих типов данных следующим образом:
T *temp=new T;
Теперь сравните адрес памяти временного номера на адрес последнего элемента вектора .... Если они отличаются на sizeof (T)
, тогда я добавлю новый элемент там сам .... иначе сделайте это так std::vector
делает это ....
Таким образом, это уменьшает затраты на копирование всех элементов ... если данные большие, то это может значительно изменить ...... !!
Pls скажите мне, если я нахожусь на правильном пути ...
Векторы не могут делать то, что вы описали, потому что это заставит 'push_back' не выполнять свою амортизированную постоянную временную сложность. Векторы довольно эффективны, особенно с C++ 11, где элементы можно перемещать, а не копировать при перераспределении. Кроме того, ваши трюки с адресным адресом памяти никоим образом не гарантированы, поэтому нет, это не будет работать в переносном режиме. – chris
['std :: vector :: reserve'] (http://en.cppreference.com/w/cpp/container/vector/reserve) – BoBTFish
Нет ... я пробовал это с моей собственной реализацией вектора. операция удаления будет иметь постоянную временную сложность ... что я делаю, только если достаточно пространства, прилегающего к последнему элементу вектора, я говорю не копировать все материалы в diff. местоположение, но выделить его рядом с самим последним элементом .... – PRP