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

Перевод указателя в итератор - C++

Восстановить пароль Регистрация
 
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
27.09.2015, 07:08     Перевод указателя в итератор #1
Есть объект лежащий в списке. В объекте есть метод, который должен этот объект из списка стереть. Чтоб объект стереть, нужен итератор. Но хранить в объекте итератор указывающий на него самого выглядит несколько глупо. Это же по сути будет дубль this. Да и неудобно к тому же, потому как этот итератор нельзя запихать в аргументы конструктора объекта (когда объект конструируется, итератора еще нет). А указатели вместо итераторов std::list не принимает. Вопрос: есть ли в каком ни будь бусте список способный вместо итераторов кушать this?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2015, 07:08     Перевод указателя в итератор
Посмотрите здесь:

C++ Итератор С++
Итератор!!!!! C++
C++ Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0]
Итератор ? C++
Итератор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
27.09.2015, 12:51     Перевод указателя в итератор #2
http://rextester.com/OWP98001

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <list>
#include <functional>
 
 
struct sample
{
    sample(){ std::cout<< "["<<this<<"] ctor\n"; }
   ~sample(){ std::cout<< "["<<this<<"] dtor\n"; }
    
    
    void killYourself()const
    {
        
        std::cout<< "["<<this<<"] kill\n";
        
        
        if(!mKiller)
            throw std::logic_error("Oh, fuck!");
        else    
            mKiller();
    }
    
    std::function<void()>
        mKiller;
    
};
 
 
 
template<class C, class... Args>
void emplace(C& container, Args&&... args)
{
    auto it 
        = container.emplace( container.end(), std::forward<Args>(args)... );
    
    const auto lambda = [it, &container]()
    {
        container.erase(it);
    };
    
    it->mKiller = lambda;
    
}
    
 
int main()
{
    std::cout << "Hello, world!\n";
    
    std::list<sample> 
        mylist;
    
    emplace(mylist);
    emplace(mylist);
    
    mylist.front().killYourself();
    mylist.front().killYourself();
    
}
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
27.09.2015, 13:20     Перевод указателя в итератор #3
Это вопрос дизайна. Хранение объектов и управление ими - ответственность не самого утопающего объекта, а контейнера. Сам объект не должен знать о хранящем его контейнере (а значит, и о способах инициировать своё создание, добавления в контейнер, удаления оттуда и уничтожения).
Впрочем, если так сильно хочется стрелять себе в ногу, нет ничего проще. Можно хранить объекты в векторе (он обеспечивает непрерывное размещение в памяти) и использовать арифметику указателей.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
27.09.2015, 18:53  [ТС]     Перевод указателя в итератор #4
Цитата Сообщение от Nick Alte Посмотреть сообщение
Это вопрос дизайна. Хранение объектов и управление ими - ответственность не самого утопающего объекта, а контейнера. Сам объект не должен знать о хранящем его контейнере (а значит, и о способах инициировать своё создание, добавления в контейнер, удаления оттуда и уничтожения).
Этот объект является обработчиком события (функция-обработчик+ее данные). В том числе и события "стоп-машина", после которого обработчик надо стереть за ненадобностью. Соответственно, именно дизайн и велит, чтоб обработчик сам себя стирал. Это ведь часть обработки события, в конце концов.

А чем тут поможет вектор, я честно говоря не понял. Там, для удаления элемента, точно также нужно итератор.
Цитата Сообщение от hoggy Посмотреть сообщение
http://rextester.com/OWP98001
По сути то же самое хранение итератора указывающего на объект, только в аргументах функтора. Но по крайней мере, он хоть в объект суется автоматом.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
27.09.2015, 19:28     Перевод указателя в итератор #5
Цитата Сообщение от Renji Посмотреть сообщение
Соответственно, именно дизайн и велит, чтоб обработчик сам себя стирал.
плохой дизайн.
самоубийство - грех.

обработчик должен обратиться к своему владельцу,
и сообщить "я отработал".

и уже его владелец (контейнер) принимает решение
о дальнейшей судьбе своего элемента.


в событийно управляемых архитектурах обычно делают так:

1.
кто-то излучает в эфир сообщение.
2.
сообщение ловит обработчик.
3.
выполняет какую то обработку.
4.
в свою очередь излучает в эфир сообщения:
"все ок", ну или "была такая то ошибка", и тп.

5.
допустим, все ок.
это сообщение в свою очередь ловит держатель обработчика (контейнер).
и стирает ставший ненужным обработчик.

если же была ошибка - ну там по обстоятельствам.
возможно обработчик ещё пригодится для повторной обработки.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
28.09.2015, 18:58     Перевод указателя в итератор #6
Цитата Сообщение от Renji Посмотреть сообщение
А чем тут поможет вектор, я честно говоря не понял. Там, для удаления элемента, точно также нужно итератор.
Нужно. Но преобразования из указателя в итератор и обратно для вектора очень простые:
C++
1
2
3
4
std::vector<MyType> v(1024);
std::vector<MyType>::iterator it = findRequiredElement(v);
MyType* ptr = &*it;
std::vector<MyType>::iterator it2 = vec.begin() + (ptr - vec.data());  // Если C++11 недоступен, то vec.begin() + (ptr - &vec[0]);
Разумеется, это всё будет создавать массу потенциальных проблем (особенно если указатель доживёт до операции добавления нового элемента или ресайза).
Yandex
Объявления
28.09.2015, 18:58     Перевод указателя в итератор
Ответ Создать тему
Опции темы

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