0

如果我注释行 insert(s, 10); 下面的程序编译得很好。

#include <iostream>
#include <iterator>
#include <set>

using namespace std;

template <class T>
void insert(std::set<T>& _s, const T& t) {
    typename std::set<T>::const_iterator i = _s.insert(t);
}

int main() {
    std::set<int> s;
    // insert<int>(s, 10); // line No: 14
}

但是,如果我取消注释第 14 行,则会收到以下错误:

set.cpp:9:54: error: conversion from ‘std::pair<std::_Rb_tree_const_iterator<int>, bool>’ to non-scalar type ‘std::set::const_iterator’ requested

4

4 回答 4

8

insert 您正在使用的重载返回对,而不是 const_iterator:

std::pair<typename std::set<T>::iterator,bool> pair = _s.insert(t);

这很丑,不是吗?使用auto(如果您使用的是 C++11):

auto pair = _s.insert(t);

可爱,不是吗?

顺便说一句,为什么它返回std::pair而不是迭代器?

因为insert如果它已经存在,可能不会添加要设置的项目。告诉您元素是已pair.second插入还是已存在 -true表示已插入,false表示未插入。是迭代器,pair.first它告诉您找到或插入元素的位置。

于 2013-08-02T09:59:14.380 回答
1

当您使用insertlike 它时,它会使用此重载:

pair<iterator,bool> insert (const value_type& val);

如您所见,它返回 apair并且您正在尝试获取 a std::set<T>::const_iterator

您可以通过以下方式修复它:

 std::pair<typename std::set<T>::iterator,bool> ret = _s.insert(t);

(就像 Nawaz 在他的帖子中所说,尝试auto改用)


返回 an 的唯一重载iterator是:

iterator insert (iterator position, const value_type& val);

参考:http : //en.cppreference.com/w/cpp/container/set/insert

于 2013-08-02T09:59:56.550 回答
1

std::set::insert这里使用的是返回一对,但它被分配给一个const_iterator

于 2013-08-02T10:44:43.057 回答
0

是的, std::set::insert 根据文档返回一对:

http://www.cplusplus.com/reference/set/set/insert/

所以你不能将结果分配给 const_iterator。额外的布尔值是告诉您插入是否成功,或者是否因为值已经在集合中而失败。

于 2013-08-02T10:01:06.613 回答