通过迭代器插入STL集

时间:2018-11-16 07:47:53

标签: c++ set

我收到以下代码的编译错误:

#include <set>
#include <string>
using namespace std;

struct string_with_set_of_strings
{
    string str;
    set< string > strs;

    string_with_set_of_strings(string s) : str(s) {}

    bool operator < (const string_with_set_of_strings & swsos) const { return str < swsos.str; }
};

int main()
{
    set< string_with_set_of_strings > A;

    pair< set< string_with_set_of_strings >::iterator, bool> it = A.insert(string_with_set_of_strings("foo"));

    if (!it.second)
        it.first->strs.insert("goo");

    return 0;
}

这是错误消息(来自Visual Studio 2017):

error C2663 : 'std::_Tree<std::_Tset_traits<_Kty,_Pr,_Alloc,false>>::insert' : 5 overloads have no legal conversion for 'this' pointer
    with
    [
        _Kty = std::string,
        _Pr = std::less<std::string>,
        _Alloc = std::allocator<std::string>
    ]

它是指我尝试插入“ goo”的行。我意识到it.second将等于true,因为第一次插入A将成功,因此在运行时甚至不会遇到“ goo”行,但这不能解释编译器错误。我不知道为什么第二次插入不被编译器接受。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您不能修改集合的元素,因此会出错。

换句话说,std :: set的元素是const,因此不可变

此外,当compiling时,错误应显示如下内容:

note:   passing 'const std::set<std::__cxx11::basic_string<char> >*'
        as 'this' argument discards qualifiers

what happens when you modify an element of an std::set?中阅读更多内容