声明一个C ++ std :: set迭代器

时间:2013-08-02 09:56:03

标签: c++ stl

如果我对行插入符号(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 个答案:

答案 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);

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

答案 2 :(得分:1)

此处使用的

std::set::insert返回一对,但将其分配给 const_iterator

答案 3 :(得分:0)

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

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

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