Удалите все объекты из станд. C++:: вектор

Слайды 25/26 это представление разговор о характеристиках различных методов для вставки сценариев. Это предполагает, что IE является единственным браузером, который выполнит те сценарии в порядке. Все другие браузеры выполнят их в порядке, который они заканчивают загружать. Даже IE не выполнит их в порядке, если у одного или нескольких будет встроенный js вместо src.

Один из предложенных методов должен вставить новый элемент DOM:

var se1 = document.createElement('script');
se1.src = 'a.js';

var se2 = document.createElement('script');
se2.src = 'b.js';

var se3 = document.createElement('script');
se3.src = 'c.js';

var head = document.getElementsByTagName('head')[0]
head.appendChild(se1);
head.appendChild(se2);
head.appendChild(se3);

Для создания второго раздела сценария генерировал Вас, мог использовать сценарий, чтобы генерировать то содержание и передать параметры:

se2.src = 'generateScript.php?params=' + someParam;

РЕДАКТИРОВАНИЕ: Несмотря на то, что статью я расположил, говорит, мое тестирование предполагает, что большинство браузеров выполнит Ваши document.write сценарии в порядке, если у каждого из них будет src, поэтому в то время как я думаю, что метод выше предпочтен, Вы могли сделать это также:


РЕДАКТИРОВАНИЕ СНОВА (ответ на комментарии мне и другим): Вы уже генерируете сценарий на своей странице. Независимо от того, что Вы делаете, может быть перемещен в другой сценарий серверной стороны, который генерирует тот же блок кода. Если Вам нужны параметры на Вашей странице, тогда передают их сценарию в строке запроса.

кроме того, можно использовать этот тот же метод, как Вы предлагаете, при генерации встроенного сценария многократно:


Однако это начинает смотреть, как будто Вы приближаетесь к этому неправильный путь. При генерации большого блока кода многократно тогда, необходимо, вероятно, заменять его единственной функцией js и называть его с различными параметрическими усилителями вместо этого...

60
задан Ajay 7 June 2016 в 07:15
поделиться

7 ответов

Я думаю, вам следует использовать std :: vector :: clear :

vec.clear();

РЕДАКТИРОВАТЬ:

Не очищает, уничтожает элементы удерживается вектором?

Да, это так. Он вызывает деструктор каждого элемента в векторе перед возвратом памяти. Это зависит от того, какие «элементы» вы храните в векторе. В следующем примере я сохраняю сами объекты внутри вектора:

class myclass
{
public:
    ~myclass()
    {

    }
...
};

std::vector<myclass> myvector;
...
myvector.clear(); // calling clear will do the following:
// 1) invoke the deconstrutor for every myclass
// 2) size == 0 (the vector contained the actual objects).

Если вы хотите, например, разделять объекты между разными контейнерами, вы можете хранить указатели на них. В этом случае, когда вызывается clear , освобождается только память указателей, фактические объекты не затрагиваются:

std::vector<myclass*> myvector;
...
myvector.clear(); // calling clear will do:
// 1) ---------------
// 2) size == 0 (the vector contained "pointers" not the actual objects).

Что касается вопроса в комментарии, я думаю, что getVector () - это определяется следующим образом:

std::vector<myclass> getVector();

Может быть, вы хотите вернуть ссылку:

// vector.getVector().clear() clears m_vector in this case
std::vector<myclass>& getVector(); 
103
ответ дан 24 November 2019 в 17:33
поделиться

vector.clear () должен работать для вас. Если вы хотите уменьшить емкость вектора вместе с очисткой, то

std::vector<T>(v).swap(v);
33
ответ дан 24 November 2019 в 17:33
поделиться

vector.clear () фактически то же самое, что vector.erase (vector. begin (), vector.end ()).

Если ваша проблема заключается в вызове delete для каждого указателя , содержащегося в вашем векторе, попробуйте следующее:

#include <algorithm>

template< typename T >
struct delete_pointer_element
{
    void operator()( T element ) const
    {
        delete element;
    }
};

// ...
std::for_each( vector.begin(), vector.end(), delete_pointer_element );

Стандартный отказ от ответственности: Код написан в браузере, не протестирован.

10
ответ дан 24 November 2019 в 17:33
поделиться

Не работает ли v.clear () по какой-то причине?

4
ответ дан 24 November 2019 в 17:33
поделиться

Используйте v.clear () , чтобы очистить вектор.

Если ваш вектор содержит указатели, clear вызывает деструктор для объекта, но не удаляет указанную память указателем.

vector<SomeClass*> v(0);

v.push_back( new SomeClass("one") );

v.clear();  //Memory leak where "one" instance of SomeClass is lost
9
ответ дан 24 November 2019 в 17:33
поделиться

Если вы храните указатели в контейнере и не хотите беспокоиться об их удалении вручную, используйте boost shared_ptr . Вот пример для std :: vector, но вы можете использовать его для любого другого контейнера STL (набор, карта, очередь, ...)

#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>

struct foo
{
    foo( const int i_x ) : d_x( i_x )
    {
        std::cout << "foo::foo " << d_x << std::endl;
    }

    ~foo()
    {
        std::cout << "foo::~foo " << d_x << std::endl;
    }

    int d_x;
};

typedef boost::shared_ptr< foo > smart_foo_t;

int main()
{
    std::vector< smart_foo_t > foos;
    for ( int i = 0; i < 10; ++i )
    {
        smart_foo_t f( new foo( i ) );
        foos.push_back( f );
    }

    foos.clear();

    return 0;
}
3
ответ дан 24 November 2019 в 17:33
поделиться

Если ваш вектор выглядит так std :: vector vecType_pt , вам нужно явно освободить память, или если ваш вектор выглядит так: std: : vector vecType_obj , конструктор будет вызываться вектором. Выполните приведенный ниже пример и поймите разницу:

  class MyClass
    {
    public:
        MyClass()
        {
            cout<<"MyClass"<<endl;
        }
        ~MyClass()
        {
            cout<<"~MyClass"<<endl;
        }
    };
    int main() 
    {
        typedef std::vector<MyClass*> vecType_ptr;
        typedef std::vector<MyClass> vecType_obj;
        vecType_ptr myVec_ptr;
        vecType_obj myVec_obj;
        MyClass obj;
        for(int i=0;i<5;i++)
        {
            MyClass *ptr=new MyClass();
            myVec_ptr.push_back(ptr);
            myVec_obj.push_back(obj);
        }
        cout<<"\n\n---------------------If pointer stored---------------------"<<endl;
        myVec_ptr.erase (myVec_ptr.begin(),myVec_ptr.end());
        cout<<"\n\n---------------------If object stored---------------------"<<endl;
        myVec_obj.erase (myVec_obj.begin(),myVec_obj.end());
        return 0;
    }
-1
ответ дан 24 November 2019 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: