std :: set和boost :: ptr_set之间的区别?

时间:2012-01-26 22:24:32

标签: c++ boost boost-ptr-container

我更改了一些代码以将std::set转换为boost::ptr_set。但是,代码不能编译;问题是我假设ptr_set插入的返回值与set插入(pair<myIter, bool>)相同。在Google上花了一个小时后,我找到this,结果发现ptr_set插页的返回值似乎是一个布尔值。

是否有关于ptr容器和std容器之间差异的确切文档?我还没有在boost网站上找到任何东西,但也许我只是愚蠢......

修改

好的 - 令我困惑的是这段代码

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

在gcc的第一行报告没有错误,但报告第二行上的operator=没有匹配,所以我认为错误是在返回类型中。但是,如果注释掉第二行,则第一行将报告为错误(释放不返回迭代器)。我发布的链接使我的困惑更加复杂,ptr_container的作者声称“ptr_set&lt;&gt;中的insert()返回bool”。但是,通过阅读链接,很明显代码当时还没有完成。谢谢Kerrek。

1 个答案:

答案 0 :(得分:3)

以下代码按预期工作,界面与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"; }
}

文档可能不是最容易导航的,但它就在那里。你应该寻找"set adapter",或许这并不是很明显。