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

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

Восстановить пароль Регистрация
 
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
10.06.2013, 01:07     как передать struct в list #1
Доброго времени суток.
Такой вопрос: есть определенная структура, в которой есть несколько полей
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) возвращает количество персонов в группе.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2013, 01:07     как передать struct в list
Посмотрите здесь:

C++ у меня созданы 2 фаила - один с классом (называется list.h), а другой с реализациями функций (list.cpp).
Ошибка при компиляции undefined reference to `List<int>::List()'| C++
Как делать текст в структурах (struct)? C++
Как использовать собственный класс в структуре struct до определения самого класса в тексте программы C++
TMemoryStream & Struct, как читать/писать структуры из/в поток? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
10.06.2013, 01:37     как передать struct в list #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;
}
__guest__
Заблокирован
10.06.2013, 01:42     как передать struct в list #3
Цитата Сообщение от Droll Посмотреть сообщение
как передать данную группу в list?
почему не хочет работать таким образом:
здесь исключительно твоя ответственность. Вряд ли кому интересно наблюдать за указателем, который указывает на указатель, который указывает на указатель , который указывает на указатель на указатель.

Добавлено через 1 минуту
говнокодь, друг. начальство все равно не заметит.
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
10.06.2013, 09:47  [ТС]     как передать struct в list #4
Спасибо Oliver. Да, примерно так и создается, но несколько сложнее. По поводу места в памяти ты прав. Ошибку понял. У меня есть еще один вопрос, а если я хочу в list хранить непосредственно персонов, а не указатели, это можно как-то сделать? ведь если у меня есть указатель на персона, могу же я по нему как-то добраться до самого персона и передать его в list, который сделает копию и запишет в себя?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
10.06.2013, 09:50     как передать struct в list #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
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.06.2013, 12:23     как передать struct в list #6

Не по теме:

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



Цитата Сообщение от Olivеr Посмотреть сообщение
его нужно просто разыменовать при передаче в функцию push_back
Это пока нет указателей в полях. Иначе придется делать глубокое копирование.
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
10.06.2013, 19:00  [ТС]     как передать struct в list #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));
только я не совсем понял, разве имя итератора не является указателем на объект контейнера?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
10.06.2013, 19:11     как передать struct в list #8
Droll, итератор - это класс поле которого содержит адрес элемента на который будет указывать итератор.
list<person>::iterator it;
it - обьект типа list<person>::iterator
&it - адрес итератора в памяти как обьекта
*it - обьект на который указывает итератор (поле класса типа указатель на person, разыменованное)
&*it - адрес этого обьекта (person)

Могу скинуть очень простую реализацию итератора
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
10.06.2013, 19:27  [ТС]     как передать struct в list #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;
}
};
я только не совсем понимаю как я буду потом им пользоваться? я имею ввиду как передавать в этот оператор () значения для сравнения, чтобы вызвать именно компаратор?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
10.06.2013, 19:38     как передать struct в list #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
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
10.06.2013, 19:42  [ТС]     как передать struct в list #11
То есть это просто компаратор для заполнения set по определенному условию, правильно я понял?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
11.06.2013, 01:24     как передать struct в list #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() {}
    };
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2013, 10:05     как передать struct в list
Еще ссылки по теме:

Работа с STL list + пропись List.h C++
Реализация std::list, сложность list::size() C++
C++ Как правильно объявлять struct переменную?

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

Или воспользуйтесь поиском по форуму:
Droll
0 / 0 / 0
Регистрация: 07.09.2012
Сообщений: 48
11.06.2013, 10:05  [ТС]     как передать struct в list #13
Еще раз спасибо, Oliver!
Yandex
Объявления
11.06.2013, 10:05     как передать struct в list
Ответ Создать тему
Опции темы

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