Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/78: Рейтинг темы: голосов - 78, средняя оценка - 4.58
141 / 110 / 30
Регистрация: 20.04.2011
Сообщений: 581
1

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

01.11.2011, 00:29. Показов 15639. Ответов 39
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
А как работать с вектором если я хочу динамический массив структур?
т.е. допустим
C++
1
2
3
4
5
6
7
8
9
struct tovar
{
   string name;
   int cost;
};
 
...
 
vector <tovar> tovar_list;
И как теперь увеличить его размер на 1 и записать в этот элемент (структуру) какие-то данные (имя и цену в данном случае)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2011, 00:29
Ответы с готовыми решениями:

Создать динамический массив структур
День добрый! Собственно задачка: Определить пользовательский тип (структуру), включающий в себя...

Как объявить динамический массив структур, и как выглядит обращение к полям структур по указателю?
Ребята подскажите как объявить динамический массив структур, и как выглядит обращение к полям...

Создать динамический массив структур, который увеличивается с помощью функции расширения
Всем привет! Нужно сделать одноменрный динамический масиив структур, который увеличиваеться с...

C++ Как удалить динамический массив структур
Как удалить массив структур, который был создан через new? Через deletedata, как заметил не...

39
141 / 110 / 30
Регистрация: 20.04.2011
Сообщений: 581
02.11.2011, 13:39  [ТС] 21
Author24 — интернет-сервис помощи студентам
А можно пример? т.е. как-то так?
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";
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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));
}
Геттеры/сеттеры сами припишите при необходимости
0
Заблокирован
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 В гугле забанили, а книжки читать мы не любим, да?
0
141 / 110 / 30
Регистрация: 20.04.2011
Сообщений: 581
02.11.2011, 14:05  [ТС] 24
Цитата Сообщение от ForEveR Посмотреть сообщение
back возвращает последний объект содержащийся в векторе.
я понял, именно это и хотел сделать в своем коде выше.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.11.2011, 14:07 25
Bers,
C++
1
 tovar_list.back()->name = "Ananas";  //доступ к последнему объекту
Это не будет работать.
0
Заблокирован
02.11.2011, 14:18 26
Цитата Сообщение от ForEveR Посмотреть сообщение
Это не будет работать.
C++
1
tovar_list.rbegin()->name = "Ananas"; //доступ к последнему объекту
А так будит?


Кстати... вот щас втыкаю - почему не будит то?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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() возвращает ссылку или конст ссылку, а не итератор
0
Заблокирован
02.11.2011, 14:26 28
аа... ну да. Ну над стрелочку заменить точечкой.
0
141 / 110 / 30
Регистрация: 20.04.2011
Сообщений: 581
02.11.2011, 19:45  [ТС] 29
А если передавать вектор в функцию и т.д., то надо использовать ссылку или оно и так по не по значению, как и обычные массивы?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.11.2011, 20:00 30
Nubik756, По значению. Это же объект.
1
Заблокирован
02.11.2011, 20:11 31
Цитата Сообщение от ForEveR Посмотреть сообщение
Nubik756, По значению. Это же объект.
зачем делать копию целого массива?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.11.2011, 20:15 32
Bers, Я сказал что по дефолту передается по значению.
Я естессн призываю передавать по const ссылке.
0
Заблокирован
02.11.2011, 20:18 33
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Я сказал что по дефолту передается по значению.
Я естессн призываю передавать по const ссылке.
Ааа..
0
1 / 1 / 2
Регистрация: 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 но в визуал они не работают может проинклудить что надо?
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.04.2014, 13:16 35
Может, надо подключить хэдэр memory, в котором объявлен shared_ptr?
0
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 изучаю и не могу разобраться как использовать, хотя на первый взгляд очень удобные вещи.
0
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
14.04.2014, 19:35 37
Вроде как .back() указывает на область памяти, следующей за последним элементом, по-этому попробуйте так:
if ( s.unix_secs == (read.back()-1).unix_secs )
0
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.
0
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
14.04.2014, 22:05 39
да, это была страшная глупость посоветовать такое. Попробуйте так:
C++
1
if ( s.unix_secs == (read.end()-1)->unix_secs )
0
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_deve... /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;
Больше способов получить данные из вектора я пока что не нашёл
0
15.04.2014, 13:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2014, 13:40
Помогаю со студенческими работами здесь

Как ввести данные в динамический массив структур?
Подскажите пожалуйста, можно ли вводить данные в динамический массив структур c помощью cin &gt;&gt;...

Динамический массив структур в другом массиве структур
Можно ли реализовать динамический (или статический) массив структур в другом массиве структур?...

Как выделить память под динамический массив объектов пользовательского типа (структур)?
Пытаюсь выделить память под динамический массив для структур, однако она не выделяется. Получается...

Как создать динамический массив типа string? Как создать класс такого массива?
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите,...

Динамический массив структур ...
Как создать дин. массив структур....пользователь должен ввести число этих массивов. вот что-то...

Динамический массив структур
Нужно сделать динамический массив структур. Задание составить перечень стран и количество...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru