如果我对行插入符号(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
答案 0 :(得分:8)
您正在使用的insert
的重载,返回对,而不是const_iterator:
std::pair<typename std::set<T>::iterator,bool> pair = _s.insert(t);
那是丑陋的,不是吗?使用auto
(如果您使用的是C ++ 11):
auto pair = _s.insert(t);
可爱,不是吗?
BTW,为什么它会返回std::pair
而不是迭代器?
因为insert
可能不会添加要设置的项目(如果它已存在)。 pair.second
告诉您元素是否已插入或已存在 - true
表示已插入,false
表示未插入。 pair.first
是迭代器,它告诉你找到或插入元素的位置。
答案 1 :(得分:1)
当您使用insert
时,它会使用此重载:
pair<iterator,bool> insert (const value_type& val);
如您所见,它返回pair
,您正试图获得std::set<T>::const_iterator
。
您可以通过执行以下操作来解决此问题:
std::pair<typename std::set<T>::iterator,bool> ret = _s.insert(t);
(就像Nawaz在他的帖子中所说,尝试使用auto
代替)
返回iterator
的唯一重载是:
iterator insert (iterator position, const value_type& val);
答案 2 :(得分:1)
std::set::insert
返回一对,但将其分配给 const_iterator
答案 3 :(得分:0)
是的,std :: set :: insert根据文档返回一对:
http://www.cplusplus.com/reference/set/set/insert/
因此您无法将结果分配给const_iterator。 额外的布尔值是告诉您插入是否成功,或者是否因为值已经在集合中而失败。