2013-08-16 2 views
0

Мне нужно сохранить отсортированную группу структур. Каков наилучший способ сделать это в векторе? Должен ли я использовать указатели для этого или сделать копию?Лучший способ хранения векторных структур

struct myStruct { 
    int i; 
    string str; 
    //whatever... 
}; 

, а затем:

vector<myStruct> v; 

или

vector<myStruct*> v; 

Заранее спасибо.

+8

Хранить ценности, если у вас нет веских причин не делать этого. – juanchopanza

+0

Спасибо. Просто бродишь, в каких случаях использование указателей должно быть в порядке. Мысль о том, что использование указателей должно минимизировать использование памяти. Извините за вопрос noob - новичок в C++ –

+1

Как это минимизирует использование памяти? – HAL

ответ

4

Запоминание сырых указателей

vector<myStruct*> v; 

это плохая идея. Кто должен их удалить? Безопаснее использовать интеллектуальный указатель, например. в C++ 11

vector<std::shared_ptr<myStruct>> v; 

или

vector<std::unique_ptr<myStruct>> v; 

в зависимости от того, что вы делаете. См here

Если у вас есть простой тип значения, то проще скопировать их то, как вы предлагаете

vector<myStruct> v; 

В противном случае, если вы хотите OO полиморфизм вы бы пойти на указатель на базу в вашей коллекции.

+0

Мех, может быть +1, если бы он не защищал неправильный умный указатель, не говоря ни слова об этом, и если бы у него не было определенного наилучшего решения в качестве последнего, это определенно не -1, по крайней мере. –

+1

@ChristianRau Я отступил от большой дискуссии и купил для дурацкого варианта. Я добавил ссылку ... – doctorlove

1

Это зависит от того, будет ли ваш вектор создавать эти структуры или нет. Если раньше, у вас нет причин хранить указатели. Указатели полезны, если вы храните фактические значения где-то в другом месте, но вам нужно собрать указатели на эти значения в одном месте.

1

Обычно магазин значения в STL контейнер является оптимальным способом, то вам не нужно беспокоиться о памяти очистить и т.д.

std::vector<myStruct> v; //#1 this is GOOD 

std::vector<myStruct*> vp; //#2 this is BAD, you need to clean pointer elements by yourself 

в случае 2, вы должны очистить динамически выделенную память себя, что-то вроде:

std::vector<myStruct*> vp; 
for(auto it = vp.begin(); it!= vp.end(); ++it) 
{ 
    delete *it; // release memory manually 
        // *it is the elemnt which is poiter, not iterator itself 
} 

Просто побродить в каких случаях использование указателей должно быть в порядке. Мысль о том, что использование указателей должно минимизировать использование памяти.

Если вам нужно сохранить полиморфизм, скажем, myStruct служит целью интерфейса, вы можете сохранить его в контейнере STL в качестве указателя.

#include <memory> 
#include <vector> 

struct myStruct 
{ 
    virtual ~myStruct() {}; 
}; 

struct Derived : public myStruct 
{ 
}; 

std::vector<std::unique_ptr<myStruct>> v; 

v.push_back(std::unique_ptr<myStruct>(new myStruct)); // pointer points to base object 
v.push_back(std::unique_ptr<myStruct>(new Derived)); // pointer points to derived object 
+0

, так как я понимаю, что я буквально не могу очистить указатель при использовании вектора v, right? –

+1

Это не так, вам нужно пройти через контейнер и удалить их один за другим. – billz

+0

okay я вижу сейчас, так что нет возможности удалить их все сразу. Это делает невозможным использование указателей в этом case. Большое спасибо. –

Смежные вопросы