Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Структуры данных


Автор: svk521 26.6.2007, 12:33
Здравствуйте!

подскажите, пожалуйста, каким образом можно наиболее рационально реализовать следующую задачу:

Ведется перехват пакетов по сети при помощи библиотеки WinPcap, далее предполагается помещать информацию в базу данных (с этим проблем нет).
Каким образом можно удерживать в виртуальной памяти информацию о пакетах в течении определенного интервала времени (например 5 минут), проверять каждый новый пришедший пакет с уже имеющимися, и при выполнении определенных условий либо добавлять информацию о пакете как новый элемент, либо проводить с пакетом какие-то иные действия? (получается работа с массивом, каждым элементом которого является структура, и размер такого массива заранее не известен)

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

Привожу описание структуры:
Код

struct TR {AnsiString      ip_comp;
           char            *NetBIOS_name;
           unsigned int    port_num;
           unsigned int    bytes_in;
           unsigned int    bytes_out;
           AnsiString      ip_src;
           double          dtime;
           unsigned int    id ;
           TR              *next;};
struct TR      *baseptr = NULL;
struct TR      *tmp = NULL;

Автор: Nat 26.6.2007, 12:47
В таких случаях удобно использовать вектор из STL. 
В хедере объявляют

std::vector<STRUKTURA>struktura_v;          //вектор 
std::vector<STRUKTURA>::iterator struktura_p;    //указатель

а в программе в конец вектора записывают новые элементы (структуры) с помощью push_back.
 

Автор: Lazin 26.6.2007, 12:52
Цитата

В таких случаях удобно использовать вектор из STL.

Если нужно часто удалять - добавлять пакеты, то лучше использовать std::list. 

Автор: Fazil6 26.6.2007, 13:23
Цитата(svk521 @  26.6.2007,  12:33 Найти цитируемый пост)
Мое решение - это использовать структуры данных, имеющих указатель на следующий элемент, но вот почитал книжки и вероятно можно еще использовать массив связных списков, но вот точнее мне солжно разобраться..

забей... Не надо тебе это. 
std::vector спасет Отца Русской демократии. 
Цитата(Lazin @  26.6.2007,  12:52 Найти цитируемый пост)
Если нужно часто удалять - добавлять пакеты, то лучше использовать std::list

это справедливо только если требуется вставка в определенную позицию, а здесь нужен std::vector или может быть очередь std::queue или std::deque  

Автор: Lazin 26.6.2007, 13:44
Цитата

Цитата

Цитата(Lazin @  26.6.2007,  12:52 Найти цитируемый пост)
Если нужно часто удалять - добавлять пакеты, то лучше использовать std::list


это справедливо только если требуется вставка в определенную позицию, а здесь нужен std::vector или может быть очередь std::queue или std::deque  

при большом размере структуры и активном использовании, бдет часто происходить изменение размеров массива, следовательно его копирование. Тогда лучше использовать ветор указателей на структуру, копирование намного быстрей будет происходить.

Автор: Fazil6 26.6.2007, 14:11
Цитата(Lazin @  26.6.2007,  13:44 Найти цитируемый пост)
при большом размере структуры и активном использовании, бдет часто происходить изменение размеров массива, следовательно его копирование.

вопервых изменение размера массива никак не зависит от размера структуры, а зависит от количества элементов, 
во-вторых при использовании vector можно избавиться от перераспределения вызовом reserve, 
в-третих при использовании очереди гарантируется остсутствие копирования элементов при вставке нового

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

Автор: svk521 26.6.2007, 17:30
Спасибо большое всем отозвавшимся!!!

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

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

Мне конечно было бы полезно если кто-нибудь приведет код-пример, на парочке элементов в случае использования
vectora   smile 

Автор: Fazil6 26.6.2007, 18:37
Цитата(svk521 @  26.6.2007,  17:30 Найти цитируемый пост)
Мне конечно было бы полезно если кто-нибудь приведет код-пример, на парочке элементов в случае использования vectora


vector позволяет работать с собой как с обычным массивом
Код

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




struct TR
{
    int x;
    int y;
};
typedef boost::shared_ptr<TR> TR_t ;

void main( )
{
    std::vector<int>             v1;   // массив интов
    std::vector<TR>        v2;   // массив структур
    std::vector<TR_t>    v3;   // масив интелектуальных указателей

    v1.push_back(0);
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);

    TR t1;
    t1.x   = 0;
    t1.y   = 5;

    v2.reserve(100);    // задание размера не меньше 100 элементов
    v2.push_back(t1);


    TR_t pt1(new TR());
    pt1->x = 1;
    TR_t pt2(new TR());
    pt2->y = 2;

    v3.push_back(pt1);
    v3.push_back(pt2);


    std::cout << "vector<int> size     = " << v1.size() << "\n";
    std::cout << "vector<int> capacity = " << v1.capacity() << "\n";
    std::cout << "vector<int> first    = " << v1[0] << "\n";
    std::cout << "*****************************************\n\n";
    
    std::cout << "vector<TR> size      = " << v2.size() << "\n";
    std::cout << "vector<TR> capacity  = " << v2.capacity() << "\n";
    std::cout << "vector<TR> first     = " << v2[0].x <<" " << v2[0].y << "\n";
    std::cout << "*****************************************\n\n";

    std::cout << "vector<TR_t> size      = " << v3.size() << "\n";
    std::cout << "vector<TR_t> capacity  = " << v3.capacity() << "\n";
    std::cout << "vector<TR_t> first     = " << v3[0]->x << " " << v3[0]->y << "\n";
    std::cout << "*****************************************\n\n";
    
}

Автор: svk521 27.6.2007, 05:39
Цитата

#include <boost/shared_ptr.hpp>

Цитата

typedef boost::shared_ptr<TR> TR_t ;


это под Visual C++ ? Мне надо С++ Builder...

Автор: zkv 27.6.2007, 06:33
Цитата(svk521 @  27.6.2007,  05:39 Найти цитируемый пост)
это под Visual C++ ?

это под буст  smile, если не хочешь ставить буст, то убери и не парься. 

Автор: svk521 27.6.2007, 12:40
 smile 
я уже разобрался и скачал нужную библиотеку!! Спасибо

Автор: svk521 3.7.2007, 16:46
Спасибо большое за приведенный прмер, он мне очень помог.
Вот только желаемого я так и не могу найти. 

Каким образом просматривать элементы вектора в моем случае?

я использую 

Код

for() {}


Заранее спасибо за ответ!

Автор: JackYF 3.7.2007, 17:41
svk521
Код

for ( int i = 0; i < vt.size(); ++i )
{
  func( v[i] );
}


Проход по вектору vt с действиями над i-м элементом.

Автор: Fazil6 3.7.2007, 17:44
Цитата(svk521 @  3.7.2007,  16:46 Найти цитируемый пост)
Каким образом просматривать элементы вектора в моем случае?

доступ по индексу как с обычным массивом
Код

std::vector<int> v;

....

for(int i = 0; i < v.size(); ++i)
{
    std::cout << v[i]    <<  "\n";
}

// или через итератор
std::vector<int>::iterator i = v.begin();
while( i != v.end())
{
       std::cout << *i    <<  "\n";
       ++i;



Автор: svk521 3.7.2007, 18:22
да-да -да
только ЭЛЕМЕНТАМИ ВЕКТОРА являются СТРУКТУРЫ

Код

struct TR {AnsiString      ip_comp;
           char            *NetBIOS_name;
           unsigned int    port_num;
           unsigned int    bytes_in;
           unsigned int    bytes_out;
           AnsiString      ip_src;
           TDateTime       dtime;
           unsigned int    id ;};

struct TR baseptr;
std::vector<TR>        v_tr; 


Вот таким образом обращаюсь к элементам структуры

Код

for(int i = 0; i<v_tr.size(); i++)
 {
 v_tr[i].id;
 v_tr[i].ip_comp
 v_tr[i].NetBIOS_name
совершаем какие-то действия с элементами структуры
и так далее
}



Мне кажется что в данном случае не правильно обращаюсь к элементам структуры через вектор

Автор: JackYF 3.7.2007, 18:32
Цитата(svk521 @  3.7.2007,  18:22 Найти цитируемый пост)
только ЭЛЕМЕНТАМИ ВЕКТОРА являются СТРУКТУРЫ

ну и что?



Цитата(svk521 @  3.7.2007,  18:22 Найти цитируемый пост)
Мне кажется что в данном случае не правильно обращаюсь к элементам структуры через вектор

обращение правильное в твоем примере.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)