Форум программистов, компьютерный форум CyberForum.ru

Как создать динамический массив структур? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 84, средняя оценка - 4.94
AlexP11223
36 / 37 / 4
Регистрация: 20.04.2011
Сообщений: 288
01.11.2011, 00:29     Как создать динамический массив структур? #1
А как работать с вектором если я хочу динамический массив структур?
т.е. допустим
C++
1
2
3
4
5
6
7
8
9
struct tovar
{
   string name;
   int cost;
};
 
...
 
vector <tovar> tovar_list;
И как теперь увеличить его размер на 1 и записать в этот элемент (структуру) какие-то данные (имя и цену в данном случае)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AlexP11223
36 / 37 / 4
Регистрация: 20.04.2011
Сообщений: 288
02.11.2011, 13:39  [ТС]     Как создать динамический массив структур? #21
А можно пример? т.е. как-то так?
C++
1
2
3
4
5
6
7
8
9
10
11
struct tovar
{
   tovar(): name(0), cost(0)
   {}
   string name;
   int cost;
};
...
vector <tovar> tovar_list;
tovar_list.resize(1, tovar() );
tovar_list.back()->name = "Ananas";
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.11.2011, 13:45     Как создать динамический массив структур? #22
Nubik756, back возвращает последний объект содержащийся в векторе.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class tovar
{
public:
    tovar(const std::string& nm, int cst):name(nm), cost(cst)
    {
    }
private:
    std::string name;
    int cost;
};
 
typedef std::vector<tovar> tovar_list;
 
int main()
{
    std::vector<tovar> vec;
    vec.push_back(tovar("1", 1));
    vec.push_back(tovar("2", 2));
}
Геттеры/сеттеры сами припишите при необходимости
Bers
Заблокирован
02.11.2011, 13:51     Как создать динамический массив структур? #23
Цитата Сообщение от Nubik756 Посмотреть сообщение
А можно пример? т.е. как-то так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct tovar
{
    tovar(): cost(0){}
    string name;
    int cost;
};
...
vector <tovar> tovar_list;
tovar_list.push_back ( tovar() ); //создадим безымяный объект на стеке,
                       // и добавим его копию в вектор
 
tovar_list.back()->name = "Ananas";  //доступ к последнему объекту
tovar_list[0].name = "Ananas"; //доступ к произвольному объекту
 
tovar& ITList = tovar_list[0]; //вытащим наружу ссылку на произвольный объект.
ITList.name = "Ananas"; //работа с объектом через ссылку.
/ps В гугле забанили, а книжки читать мы не любим, да?
AlexP11223
36 / 37 / 4
Регистрация: 20.04.2011
Сообщений: 288
02.11.2011, 14:05  [ТС]     Как создать динамический массив структур? #24
Цитата Сообщение от ForEveR Посмотреть сообщение
back возвращает последний объект содержащийся в векторе.
я понял, именно это и хотел сделать в своем коде выше.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.11.2011, 14:07     Как создать динамический массив структур? #25
Bers,
C++
1
 tovar_list.back()->name = "Ananas";  //доступ к последнему объекту
Это не будет работать.
Bers
Заблокирован
02.11.2011, 14:18     Как создать динамический массив структур? #26
Цитата Сообщение от ForEveR Посмотреть сообщение
Это не будет работать.
C++
1
tovar_list.rbegin()->name = "Ananas"; //доступ к последнему объекту
А так будит?


Кстати... вот щас втыкаю - почему не будит то?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.11.2011, 14:22     Как создать динамический массив структур? #27
Bers, Да. Только на кой так извращаться?
И так тоже будет.

C++
1
2
std::vector<tovar>::iterator iter = tovar_list.insert(tovar_list.end(), tovar());
iter->name = "Ananas";
Я имел ввиду что back() возвращает ссылку или конст ссылку, а не итератор
Bers
Заблокирован
02.11.2011, 14:26     Как создать динамический массив структур? #28
аа... ну да. Ну над стрелочку заменить точечкой.
AlexP11223
36 / 37 / 4
Регистрация: 20.04.2011
Сообщений: 288
02.11.2011, 19:45  [ТС]     Как создать динамический массив структур? #29
А если передавать вектор в функцию и т.д., то надо использовать ссылку или оно и так по не по значению, как и обычные массивы?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.11.2011, 20:00     Как создать динамический массив структур? #30
Nubik756, По значению. Это же объект.
Bers
Заблокирован
02.11.2011, 20:11     Как создать динамический массив структур? #31
Цитата Сообщение от ForEveR Посмотреть сообщение
Nubik756, По значению. Это же объект.
зачем делать копию целого массива?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.11.2011, 20:15     Как создать динамический массив структур? #32
Bers, Я сказал что по дефолту передается по значению.
Я естессн призываю передавать по const ссылке.
Bers
Заблокирован
02.11.2011, 20:18     Как создать динамический массив структур? #33
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Я сказал что по дефолту передается по значению.
Я естессн призываю передавать по const ссылке.
Ааа..
Kritt
 Аватар для Kritt
1 / 1 / 0
Регистрация: 18.01.2013
Сообщений: 65
08.04.2014, 13:00     Как создать динамический массив структур? #34
Я только начал изучать с++ поэтому не сильно разбираюсь, прошу у вас помощи в разъяснение почему может не работать это!
У меня стоят визуал студио 2013(2012) на них не работает:
Цитата Сообщение от ForEveR Посмотреть сообщение
struct tovar
{
* *string name;
* *int cost;
};
typedef std::shared_ptr<tovar> tovar_ptr;
std::vector <tovar_ptr> tovar_list;
tovar_list.push_back(tovar_ptr(new tovar());
tovar_list.back()->name = "name";
А именно вот эта строчка из того кода
C++
1
typedef std::shared_ptr<tovar> tovar_ptr;
еще в некоторых кодах видел стоит _tmain и TCHAR но в визуал они не работают может проинклудить что надо?
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
08.04.2014, 13:16     Как создать динамический массив структур? #35
Может, надо подключить хэдэр memory, в котором объявлен shared_ptr?
konstantine_
0 / 0 / 0
Регистрация: 14.04.2014
Сообщений: 14
14.04.2014, 19:20     Как создать динамический массив структур? #36
Здравствуйте, тоже изучаю C++ и прошу совета.

В общем у меня такая структура:
C++
1
2
3
4
5
6
7
8
9
10
struct IP_LOGS {
    unsigned int unix_secs;
    unsigned int dpkts;
    unsigned int doctets;
    unsigned long srcaddr;
    unsigned long dstaddr;
    unsigned int srcport;
    unsigned int dstport;
    int prot;
};
Я создал динамический массив типа данной структуры:
C++
1
vector <IP_LOGS> read;
Дальше я заношу в этот массив значения следующим способом:
C++
1
2
3
4
5
IP_LOGS s;
//Считываю из файла в s.имя_значения данные
..
 
read.push_back(s); //Добавляем считанные элементы в вектор
Со вставкой вроде тоже всё нормально, а вот дальше я не могу понять как мне получить из вектора конкретное значение структуры, например:
C++
1
2
3
4
5
6
7
8
    if ( s.unix_secs == read.back().unix_secs ) //Если мы всё ещё считывает строки из файла с одним и тем же значением времени(unix_time)
        read.push_back(s); //Добавляем считанные элементы в вектор
    else //иначе обрабатываем и добавляем в базу считанный список 
        {
        iplogs_to_bd();
        read.clear(); 
        read.push_back(s);
    }   //endif ( read.unix_secs = *tail->unix_secs )
тут у меня происходит "Segmentation fault (core dumped)"
А как нужно правильно ?

п.с. задолбался работать со связным списком на указателях, вот вычитал про std::list и std::vector изучаю и не могу разобраться как использовать, хотя на первый взгляд очень удобные вещи.
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
14.04.2014, 19:35     Как создать динамический массив структур? #37
Вроде как .back() указывает на область памяти, следующей за последним элементом, по-этому попробуйте так:
if ( s.unix_secs == (read.back()-1).unix_secs )
konstantine_
0 / 0 / 0
Регистрация: 14.04.2014
Сообщений: 14
14.04.2014, 21:14     Как создать динамический массив структур? #38
Попробывал вашим методом не компилится:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
konstantine@mgate1_0:13:47_> ./compile.sh ../flow.export
clang++: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
logsexport.c:131:37: error: invalid operands to binary expression ('value_type' (aka 'IP_LOGS') and 'int')
    if ( s.unix_secs == (read.back()-1).unix_secs ) //<U+0415><U+0441><U+043B><U+0438> <U+043C><U+044B> <U+0432><U+0441><U+0451> <U+0435><U+0449>...
                         ~~~~~~~~~~~^~
/usr/include/c++/v1/iterator:606:1: note: candidate template ignored: could not match 'reverse_iterator<type-parameter-0-0>' against 'IP_LOGS'
operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
^
/usr/include/c++/v1/iterator:1001:1: note: candidate template ignored: could not match 'move_iterator<type-parameter-0-0>' against 'IP_LOGS'
operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
^
/usr/include/c++/v1/iterator:1353:1: note: candidate template ignored: could not match '__wrap_iter<type-parameter-0-0>' against 'IP_LOGS'
operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
^
/usr/include/c++/v1/string:481:11: note: candidate template ignored: could not match 'fpos<type-parameter-0-0>' against 'IP_LOGS'
streamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
          ^
1 error generated.
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
14.04.2014, 22:05     Как создать динамический массив структур? #39
да, это была страшная глупость посоветовать такое. Попробуйте так:
C++
1
if ( s.unix_secs == (read.end()-1)->unix_secs )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2014, 13:40     Как создать динамический массив структур?
Еще ссылки по теме:

C++ как создать массив структур?
Динамический массив структур C++
Как создать динамический массив типа string? Как создать класс такого массива? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
konstantine_
0 / 0 / 0
Регистрация: 14.04.2014
Сообщений: 14
15.04.2014, 13:40     Как создать динамический массив структур? #40
В этом случае компилится, но опять так же уходит в core dump. Тогда я решил перепровериться и опять в данное условие вернул введённую заранее переменную tmp_unixtime и тогда у меня всё сработало в штатном режиме.

Bash
1
2
3
4
5
6
7
8
konstantine@mgate1_9:25:08_> ./compile.sh ../flow.export
clang++: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
Segmentation fault (core dumped)
konstantine@mgate1_9:25:11_> 
konstantine@mgate1_9:25:12_> ./compile.sh ../flow.export
clang++: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
Строк считанно: 662
konstantine@mgate1_9:26:20_>
Вся беда в том, что я вроде научился добавлять в вектор элементы, но вот считывать их от туда нет и тем более производить какие то с ними операции - НЕТ. В интернете мало примеров как работать с вектором типа структуры, либо я плохо ищу.

Добавлено через 3 часа 43 минуты
В общем нагуглил я документацию по стандартной библиотеке шаблонов (STL) сейчас вникаю, так что я думаю мой вопрос исчерпан.

Вот документация где можно найти ответы на вопросы данной темы:
http://www.firststeps.ru/mfc/stl/
http://progs.biz/cpp/stl/lessons/001.aspx
http://www.solarix.ru/for_developers/cpp/stl/stl.shtml
http://www.codenet.ru/progr/cpp/stl/Using-STL.php

Всем спасибо!

Добавлено через 3 часа 14 минут
Я долго думал и всё таки решил выложить пример ответа на мой вопрос, т.к. неаверное не все захотят читать литературу.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <vector>
 
using namespace std;
 
struct list {
    unsigned long srcaddr;
    unsigned long dstaddr;
    int prot;
};
 
int main()
{
    list TEST;
    vector<list> v_test;
    cout << "Size Vector " << v_test.size() << endl;
    cout << "Capacity Vector " << v_test.capacity() << endl;
    cout << "Max_Size Vector " << v_test.max_size() << endl;
 
    for (int i=0;i<5;i++)   { // Как будто читаем из файла и заполняем данными
        TEST.srcaddr = 1999998887 + i;
        TEST.dstaddr = 1995558887 - i;
        TEST.prot = 2 * i;
        v_test.push_back(TEST);
        }
    cout << "Size Vector " << v_test.size() << endl;
    cout << "Capacity Vector " << v_test.capacity() << endl;
    cout << "Max_Size Vector " << v_test.max_size() << endl;
 
    vector <list>::iterator p;
    cout << "Содержимое: \n";
    for (p = v_test.begin(); p < v_test.end(); p++)
        cout << p->srcaddr << " " << p->dstaddr << " " << p->prot << endl;
 
    v_test.resize(3);
    cout << "Содержимое: \n";
    for (p = v_test.begin(); p < v_test.end(); p++)
        cout << p->srcaddr << " " << p->dstaddr << " " << p->prot << endl;
return 0;
}
Как я понял, т.к. у нас тип вектора не стандартного типа данных, а типа структуры, то соответственно доступ к элементам вектора нужно получать через итераторы(аля указатели). При этом работа с итераторами полностью аналогична указателям, т.е. т.к. у нас указатель на СТРУКТУРУ, то мы используем p->srcaddr, если бы был стандартный тип, например char, то можно было просто разименовать указатель - *p.

Знатоки поправьте меня где я не прав.

Добавлено через 7 минут
Блин я сам себе противоречу)))

Оказывается можно не только итераторами, но и через ссылки:

C++
1
2
3
4
    v_test.resize(3); //Уменьшаем размер ветора до трёх элементов
    cout << "Содержимое: \n";
    for (int i = 0; i < v_test.size(); i++)
        cout << v_test[i].srcaddr << " " << v_test[i].dstaddr << " " << v_test[i].prot << endl;
Больше способов получить данные из вектора я пока что не нашёл
Yandex
Объявления
15.04.2014, 13:40     Как создать динамический массив структур?
Ответ Создать тему
Опции темы

Текущее время: 17:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru