Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
#1

как передать struct в list - C++

10.06.2013, 01:07. Просмотров 793. Ответов 12
Метки нет (Все метки)

Доброго времени суток.
Такой вопрос: есть определенная структура, в которой есть несколько полей
C++
1
2
3
4
5
typedef struct _person{
      long id;
      char name[Max_Name];
      size_t age;
}person;
далее есть группа данных персонов:
C++
1
typedef person** group_t;
как передать данную группу в list?
почему не хочет работать таким образом:
C++
1
list <person> ls(group,group+getSizeGroup(group));

предварительно группа создана и заполнена. getSizeGroup(group) возвращает количество персонов в группе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2013, 01:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как передать struct в list (C++):

Как вывести значения vector<list<struct>> ? - C++
У меня есть структура: struct graph { int i, j, len }; и массив списков: vector&lt;list&lt;graph&gt;&gt; g; Как мне вывести в цикле...

Компаратор для сортировки vector<list<struct>> - C++
Помогите, как реализовать компаратор для сортировки vector&lt;list&lt;struct&gt;&gt; ? struct Edge { int i,j,len; }; Массив заполняется...

Не могу разобраться как передать корректно передать массив из функции в функцию - C++
//--------------------------------------------------------------------------- #pragma hdrstop ...

Как правильно использовать struct? - C++
Написал небольшую, глупенькую программку, но столкнулся с проблемой заполнения структуры. Если kube.size вводит, то kube.color программа...

Как делать текст в структурах (struct)? - C++
В самой функции main переменная &quot;char name&quot; работает, а в struct нет. Как правильно задать текстовый тип данных в struct? struct city...

Как правильно объявлять struct переменную? - C++
Как правильно объявлять? str one или struct str one; #include &lt;iostream&gt; using namespace std; struct str { int a; int b; ...

12
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
10.06.2013, 01:37 #2
Двумерный массив создается примерно таким образом?
C++
1
2
3
4
5
6
7
8
9
10
    _person **persons = new _person*[3];
    for (int i = 0; i != 3; ++i)
        persons[i] = new _person[3];
 
    for (int i = 0; i != 3; ++i)
        for (int j = 0; j != 3; ++j) {
            persons[i][j].id = j * j * i;
            strcpy(persons[i][j].name, "Name");
            persons[i][j].age = j * i;
        }
Если да, то дело в том, что строки массива разбросаны по памяти, они не в одном блоке, так что запись:
C++
1
list <person> ls(group,group+getSizeGroup(group));
неверна.

Добавлено через 5 минут

Думаю, что хранить указатели будет разумнее. Вот маленький пример:
Кликните здесь для просмотра всего текста
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
41
42
43
#include <iostream>
#include <cstring>
#include <list>
 
using namespace std;
 
typedef struct _person
{
    long id;
    char name[30];
    size_t age;
};
 
int main()
{
    _person **persons = new _person*[3];
    for (int i = 0; i != 3; ++i)
        persons[i] = new _person[3];
 
    for (int i = 0; i != 3; ++i)
        for (int j = 0; j != 3; ++j) {
            persons[i][j].id = j * j * i;
            strcpy(persons[i][j].name, "Name");
            persons[i][j].age = j * i;
        }
 
    list<_person*> lst;
 
    for (int i = 0; i != 3; ++i)
        for (int j = 0; j != 3; ++j) 
            lst.push_back(&persons[i][j]);
 
    for (const auto &x : lst)
        cout << "id = " << x->id << endl
             << "name = " << x->name << endl
             << x->age << endl << endl;
 
    for (int i = 0; i != 3; ++i)
        delete[] persons[i];
    delete[] persons;
    
    return 0;
}
1
__guest__
Заблокирован
10.06.2013, 01:42 #3
Цитата Сообщение от Droll Посмотреть сообщение
как передать данную группу в list?
почему не хочет работать таким образом:
здесь исключительно твоя ответственность. Вряд ли кому интересно наблюдать за указателем, который указывает на указатель, который указывает на указатель , который указывает на указатель на указатель.

Добавлено через 1 минуту
говнокодь, друг. начальство все равно не заметит.
0
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
10.06.2013, 09:47  [ТС] #4
Спасибо Oliver. Да, примерно так и создается, но несколько сложнее. По поводу места в памяти ты прав. Ошибку понял. У меня есть еще один вопрос, а если я хочу в list хранить непосредственно персонов, а не указатели, это можно как-то сделать? ведь если у меня есть указатель на персона, могу же я по нему как-то добраться до самого персона и передать его в list, который сделает копию и запишет в себя?
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
10.06.2013, 09:50 #5
Droll, конечно можно
Пример:
Кликните здесь для просмотра всего текста
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
41
42
#include <iostream>
#include <cstring>
#include <list>
 
using namespace std;
 
typedef struct _person
{
    long id;
    char name[30];
    size_t age;
};
 
int main()
{
    _person **persons = new _person*[3];
    for (int i = 0; i != 3; ++i)
        persons[i] = new _person[3];
 
    for (int i = 0; i != 3; ++i)
        for (int j = 0; j != 3; ++j) {
            persons[i][j].id = j * j * i;
            strcpy(persons[i][j].name, "Name");
            persons[i][j].age = j * i;
        }
 
    list<_person> lst;
 
    for (int i = 0; i != 3; ++i)
        for (int j = 0; j != 3; ++j)
            lst.push_back(persons[i][j]);
 
    for (int i = 0; i != 3; ++i)
        delete[] persons[i];
    delete[] persons;
 
    for (const auto &x : lst)
        cout << "id = " << x.id << endl
             << "name = " << x.name << endl
             << x.age << endl << endl;
    return 0;
}


Добавлено через 50 секунд
Цитата Сообщение от Droll Посмотреть сообщение
ведь если у меня есть указатель на персона, могу же я по нему как-то добраться до самого персона и передать его в list, который сделает копию и запишет в себя?
его нужно просто разыменовать при передаче в функцию push_back
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.06.2013, 12:23 #6

Не по теме:

Цитата Сообщение от Droll Посмотреть сообщение
группа данных персонов
Цитата Сообщение от Droll Посмотреть сообщение
количество персонов в группе
OMG



Цитата Сообщение от Olivеr Посмотреть сообщение
его нужно просто разыменовать при передаче в функцию push_back
Это пока нет указателей в полях. Иначе придется делать глубокое копирование.
0
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
10.06.2013, 19:00  [ТС] #7
Еще раз спасибо Oliver. Усложняем задачу)) А теперь на основе list мне нужно построить map:
C++
1
map<size_t, person*>
где size_t это ключ на Id персона. У меня ен получается передать указатель на персона в map
C++
1
2
3
4
5
6
typedef map <size_t,person*>::value_type valType;
list<person>::iterator it = m_persons.begin();
for(size_t i=0;i<m_persons.size();i++,it++)
{
    m_personId.insert(valType(it->id,it));
}
m_persons - это list
Подскажите пожалуйста, в чем проблема?

Добавлено через 11 минут
нашел ошибку, нужно было так:
C++
1
m_personId.insert(valType(it->id,&*it));
только я не совсем понял, разве имя итератора не является указателем на объект контейнера?
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
10.06.2013, 19:11 #8
Droll, итератор - это класс поле которого содержит адрес элемента на который будет указывать итератор.
list<person>::iterator it;
it - обьект типа list<person>::iterator
&it - адрес итератора в памяти как обьекта
*it - обьект на который указывает итератор (поле класса типа указатель на person, разыменованное)
&*it - адрес этого обьекта (person)

Могу скинуть очень простую реализацию итератора
1
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
10.06.2013, 19:27  [ТС] #9
Вот теперь все понятно, спасибо. Скинь если не сложно.
У меня еще один вопрос, в продолжение этой программы. следущее задание создать multiset основываясь на list, который уже создан
C++
1
multiset <person*, compAge> m_personAge;
компаратор должен будет вернуть правду если возраст персона меньше передаваемого. Я та кпонимаю, что компаратор должен выглядеть примерно так:
C++
1
2
3
4
5
6
struct compAge{
public:
bool operator()(person* prs,size_t pattern){
    return prs->age >= pattern;
}
};
я только не совсем понимаю как я буду потом им пользоваться? я имею ввиду как передавать в этот оператор () значения для сравнения, чтобы вызвать именно компаратор?
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
10.06.2013, 19:38 #10
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
#include <iostream>
#include <set>
 
using namespace std;
 
struct person
{
    person(int _id, int _age): id(_id), age(_age) {}
    int id, age;
    //bool operator > (const person &obj) { return this->age < obj.age; }
    //можно опеределить такой оператор, если бы мы хранили объекты по значению
};
 
struct compareAge { bool operator () (person *a, person *b) { return a->age > b->age; } };
//по возрастанию возраста поменять > на <
 
int main()
{
    person a(123, 12), b(124, 44), c(125, 55), d(126, 7);
    multiset<person*, compareAge> mltset;
    mltset.insert(&a);
    mltset.insert(&b);
    mltset.insert(&d);
    mltset.insert(&c);
 
    for (auto it = begin(mltset); it != end(mltset); ++it)
        cout << (*it)->id << ", age = " << (*it)->age << endl;
 
    return 0;
}
Добавлено через 1 минуту
Но как Вы сами видите, слишком много обращений к указателям, то есть слишком много разыменований. Это не очень хорошо. Особенно такая запись: (*it)->id
1
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
10.06.2013, 19:42  [ТС] #11
То есть это просто компаратор для заполнения set по определенному условию, правильно я понял?
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
11.06.2013, 01:24 #12
Droll, для расположения элементов в определенном порядке. Да.

Добавлено через 5 часов 40 минут
Цитата Сообщение от Olivеr Посмотреть сообщение
Могу скинуть очень простую реализацию итератора
Цитата Сообщение от Droll Посмотреть сообщение
Вот теперь все понятно, спасибо. Скинь если не сложно.
Кликните здесь для просмотра всего текста
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
    class iterator: public std::iterator<std::random_access_iterator_tag, Type>
    {
        Type *ptr;
    public:
        iterator(): ptr(nullptr) {}
        iterator(Type *x): ptr(x) {}
        iterator(const iterator &obj): ptr(obj.ptr) {}
        iterator(iterator &&obj): ptr(move(obj.ptr)) { obj.ptr = nullptr; }
 
        iterator& operator = (const iterator &obj) { ptr = obj.ptr; return *this; }
        iterator& operator = (iterator &&obj) { ptr = move(obj.ptr); return *this; }
 
        friend bool operator == (const iterator &a, const iterator &b) { return a.ptr == b.ptr; }
        friend bool operator != (const iterator &a, const iterator &b) { return a.ptr != b.ptr; }
 
        Type& operator * () { return *ptr; }
        Type& operator -> () { return *ptr; }
 
        iterator& operator ++ () { ++ptr; return *this; }
        iterator operator ++ (int) { iterator temp(*this); ++ptr; return temp; }
        iterator& operator -- () { --ptr; return *this; }
        iterator operator -- (int) { iterator temp(*this); --ptr; return temp; }
 
        friend int operator - (const iterator &a, const iterator &b) { return a.ptr - b.ptr; } //a - b
        friend iterator operator - (const iterator &a, int n) { return a.ptr - n; } //a - n
        friend iterator operator + (const iterator &a, int n) { return a.ptr + n; } //a + n
        friend iterator operator + (int n, const iterator &a) { return a.ptr + n; } //n + a
 
        iterator& operator -= (int n) { this->ptr -= n; return *this; }
        iterator& operator += (int n) { this->ptr += n; return *this; }
 
        friend bool operator > (const iterator &a, const iterator &b) { return a.ptr > b.ptr; }
        friend bool operator < (const iterator &a, const iterator &b) { return a.ptr < b.ptr; }
        friend bool operator >= (const iterator &a, const iterator &b) { return a.ptr >= b.ptr; }
        friend bool operator <= (const iterator &a, const iterator &b) { return a.ptr <= b.ptr; }
 
        void swap(iterator &obj) { Type *_ptr = this->ptr; this->ptr = obj.ptr; obj.ptr = _ptr; }
 
        ~iterator() {}
    };
1
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
11.06.2013, 10:05  [ТС] #13
Еще раз спасибо, Oliver!
0
11.06.2013, 10:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2013, 10:05
Привет! Вот еще темы с ответами:

TMemoryStream & Struct, как читать/писать структуры из/в поток? - C++
на ++ пытаюсь перейти недавно... на С, задача была тривиальной и решена давно, но по обстоятельствам нужно перенести на С++. на...

Объясните как с этой штукой работать (struct) или написание чудо софта! - C++
Преамбула: Давеча прикупил себе чудесную штуку, заветься NAS. Дума ну ок теперь хоть винт разгружу да и фильмецов с кучей всего понакидаю...

Как использовать собственный класс в структуре struct до определения самого класса в тексте программы - C++
Проблема такая: хочу в структуре одним из элементов сделать класс. Проблема в том, что эта структура задается в самом начале текста...

Ошибка при компиляции undefined reference to `List<int>::List()'| - C++
Доброго времени суток=) столкнулась с такой проблемой нужно написать шаблон класса. При компиляции выдает ошибку undefined reference to...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru