【问题标题】:Differences between std::set and boost::ptr_set?std::set 和 boost::ptr_set 之间的区别?
【发布时间】:2012-01-26 22:24:31
【问题描述】:

我更改了一些代码以将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 中的插入()返回布尔值”。但是,继续阅读链接,很明显当时代码还没有完成。谢谢克雷克。

【问题讨论】:

  • 缺少the documentation 怎么办?
  • 如果您发布的链接中有关于集合插入的返回值的内容,那么我找不到它。或在其他几个页面中。没有一个示例显示集合插入的返回值。这对我来说似乎很缺乏。
  • 引用包含this page,其中概述了insert(从我的第一个链接到这里需要单击2 次)。
  • 我同意@EML:文档真的很难使用。

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


【解决方案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"; }
}

文档可能不是最容易浏览的,但它就在那里。不过,您应该寻找"set adapter",也许这并不完全明显。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-25
    • 2018-08-23
    • 2016-05-12
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多