【问题标题】:C++ unordered_set<insert function> return valueC++ unordered_set<插入函数> 返回值
【发布时间】:2021-05-10 19:26:35
【问题描述】:

我正在尝试检查 unordered_set 的 insert() 函数的返回值,但遇到以下错误:

unordered_set<int> t;
t.insert(1);
t.insert(2);
t.insert(3);
t.insert(4);
std::unordered_set<int>::iterator it = t.insert(1); **//Error**
cout<<"size of t="<<t.size()<<endl;

错误-->从 'std::pair<:__detail::_node_iterator true false>, bool>' 转换为非标量类型 'std::unordered_set::iterator {又名 std::__detail::_Node_iterator}' 请求

-->如果插入函数不成功,插入函数应该发送一个空迭代器,但我无法为插入函数的返回值声明正确的迭代器。 -->在这种情况下,插入函数的 unordered_set 迭代器的正确类型应该是什么?

【问题讨论】:

  • std::unordered_set::insert,返回的不是迭代器,而是一个pair&lt;iterator, bool&gt;
  • 你检查过 auto 吗? auto 在大多数编译时类型中进行类型推导

标签: c++ stl unordered-set


【解决方案1】:

你对unordered_set::insert返回值的理解是错误的。

返回一个由插入元素的迭代器组成的对(或 到阻止插入的元素)和一个 bool 表示 插入是否发生。

(来自cppreference

所以正确的声明是

std::pair<std::unordered_set<int>::iterator, bool> it = t.insert(1);

但实际上(假设你有 C++11)写起来要容易得多

auto it = t.insert(1);

如果你只对返回的迭代器感兴趣,那么你也可以写

std::unordered_set<int>::iterator it = t.insert(1).first;

或再次使用自动

auto it = t.insert(1).first;

【讨论】:

  • 如何验证 it1 迭代器,下面的比较不起作用。 auto it1 = n.insert(1).first; if(it1 == n.end()) { cout
  • @SantoshSahu 你读过我的报价吗? a bool denoting whether the insertion took place 所以你可以像这样测试auto it = n.insert(1); if (!it.second) cout&lt;&lt;"unsuccessful"&lt;&lt;endl;
猜你喜欢
  • 1970-01-01
  • 2021-04-08
  • 2022-11-30
  • 2017-08-12
  • 1970-01-01
  • 2016-08-28
  • 2015-12-28
  • 2011-02-06
  • 2012-06-16
相关资源
最近更新 更多