Различия между std::set и boost::ptr_set?
Я изменил код для преобразования 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 ответ
Следующий код работает, как и ожидалось, и интерфейс такой же, как для 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"; }
}
Документация, возможно, не самая простая для навигации, но она есть. Вы должны искать "установить адаптер", хотя, возможно, это не совсем очевидно.