Nano Hash - криптовалюты, майнинг, программирование

Как объект C++ может иметь в качестве члена итератор своей позиции в std::list?

У меня есть приложение, в котором есть узлы, которые связаны друг с другом. Каждый узел хранит список входящих и исходящих соединений с другими узлами. Время от времени принимающему узлу необходимо иметь возможность избавиться от одного из своих входящих соединений. Когда это происходит, я хочу, чтобы соединение было удалено не только из списка входящих соединений узла-получателя, но и из списка исходящих соединений узла-отправителя. Но для этого узлу-получателю нужен итератор узла-отправителя для соединения. Было бы неплохо, если бы я мог просто сохранить этот итератор как член объекта подключения. Но попытка сделать это даже не скомпилируется. Когда я пытаюсь объявить итератор как член класса, компилятор говорит мне, что это неопределенный тип. Вот как выглядит мое объявление класса:

class Connection
{
   public:
   Connection();
   ~Connection();

   Node* pSourceNode;
   std::list<Connection*>::iterator SourcesIterator;
};

Есть ли какой-нибудь изящный способ заставить это или что-то подобное работать без необходимости писать свой собственный связанный список? Возможно, какая-то структура данных, которая до сих пор ускользала от меня?


  • ИМО, это может быть опасно, так как итераторы могут быть признаны недействительными в некоторых алгоритмах. 27.01.2011
  • @Max: Подождите, программист на C++, который не верит, что не взорвет что-нибудь? Вы уверены, что используете правильный язык? 27.01.2011
  • Дело не в том, что я не доверяю себе. На самом деле, я уже написал свой собственный навязчивый связанный список, когда друг отругал меня за то, что я не использую готовый stl-контейнер. Так много для того, чтобы попытаться написать более чистый код... 27.01.2011
  • о, да ладно, вы были правы с этой идеей назойливого контейнера! Не позволяйте людям так легко влиять на ваше решение. ;) И если вы хотите, чтобы это было стандартное решение, boost::intrusive для вас. 28.01.2011

Ответы:


1

Я смог скомпилировать ваш код просто отлично. Вы делаете #include <list> в заголовке?

Возможно, вы все равно не захотите держать рядом с собой iterator; большое количество операций делает их недействительными. Вы можете сохранить указатель на рассматриваемый list и получить новый iterator при необходимости.

27.01.2011
  • Да, я включил include. Возможно, это действительно проблема моего старого компилятора? Я использую VC6.0 27.01.2011
  • VC6 определенно отстает в плане поддержки шаблонов. 27.01.2011
  • Недействительность итератора здесь не должна быть проблемой. Единственный способ аннулировать итератор списка — это стереть его; даже нарезка и сращивание не делают недействительными. 27.01.2011

  • 2

    Вы можете попробовать комбинацию объявления typedef/forward, может работать лучше в VC6:

    typedef class Connection* ConnectionPtr;
    class Connection
    {
       public:
       Connection();
       ~Connection();
    
       Node* pSourceNode;
       std::list<ConnectionPtr>::iterator SourcesIterator;
    };
    
    27.01.2011
  • Согласен, кроме добавления: class Connection; еще до строки ConnectionPtr. Кажется, я припоминаю, что классы не определены до определения def. закончился. По крайней мере, я смутно припоминаю, с какого-то момента времени. 27.01.2011
  • @JDonner: я не думаю, что даже VC6 был настолько сломан. class Connection в typedef вводит неполный тип класса, которого вполне достаточно для создания указателей. 27.01.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..