Различия между std :: set и boost :: ptr_set? - PullRequest
1 голос
/ 27 января 2012

Я изменил код для преобразования std::set в boost::ptr_set.Однако код не компилируется;проблема в том, что я предполагаю, что возвращаемое значение из вставки ptr_set совпадает со значением вставки set (pair<myIter, bool>).Через час в Google я нашел это , и оказалось, что возвращаемое значение из вставки ptr_set выглядит как бул.

Есть ли какие-либо окончательные документы о различиях междуконтейнеры ptr и контейнеры std?На сайте буста я ничего не нашел, но, может быть, я просто тупой ...

РЕДАКТИРОВАТЬ

Хорошо - меня смущало то, что этот код

  t.insert(s.release(s.begin()));
  p = t.insert(s.release(s.begin()));

сообщает об отсутствии ошибки в первой строке в gcc, но сообщает о не совпадении для operator= во второй строке, поэтому я подумал, что ошибка в возвращаемом типе.Однако, если вы закомментируете вторую строку, то первая строка затем сообщается как ошибка (релиз не возвращает итератор).Моя путаница усугублялась размещенной мною ссылкой, в которой автор ptr_container заявляет, что «insert () в ptr_set <> возвращает bool».Однако, читая по ссылке, становится очевидным, что код не был закончен в то время.Спасибо, Керрек.

1 Ответ

3 голосов
/ 27 января 2012

Следующий код работает, как и ожидалось, и интерфейс такой же, как для std::set::insert():

#include <boost/ptr_container/ptr_set.hpp>
#include <boost/assign/ptr_list_inserter.hpp>
#include <iostream>

int main()
{
  boost::ptr_set<int> s;

  {
    auto p = s.insert(new int(4));
    std::cout << "Element " << *p.first << (p.second ? " inserted" : " already existed") << std::endl;
  }
  {
    auto p = s.insert(new int(4));
    std::cout << "Element " << *p.first << (p.second ? " inserted" : " already existed") << std::endl;
  }

  boost::assign::ptr_insert(s)(1)(2)(3)(4);

  for (auto it = s.begin(), end = s.end(); it != end; ++it) { std::cout << *it << "\n"; }
}

Возможно, документация не самая простая для навигации, но она есть.Вам следует поискать «набор адаптеров» , хотя, возможно, это не совсем очевидно.

...