Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用构造函数将元素插入std::set_C++_Stl - Fatal编程技术网

C++ 使用构造函数将元素插入std::set

C++ 使用构造函数将元素插入std::set,c++,stl,C++,Stl,在std::list的情况下,是否可以向std::set插入新元素,例如: //在mylist的子列表中插入一个名为“string”的元素 std::list< std::list<string> > mylist; mylist.push_back(std::list<string>(1, "string")); std::listmylist; mylist.push_back(std::list(1,“string”); 现在,mylist在其std

在std::list的情况下,是否可以向std::set插入新元素,例如:

//在mylist的子列表中插入一个名为“string”的元素

std::list< std::list<string> > mylist;
mylist.push_back(std::list<string>(1, "string"));
std::listmylist;
mylist.push_back(std::list(1,“string”);
现在,mylist在其std::list类型的子列表中有一个std::string类型的元素

如果std::set是std::list my list的子集,即

std::list<std::set <string>> mylist;
std::list mylist;

如果你做不到,那为什么不呢?

我认为这应该可以做到:

int main()
{
    string s = "test";
    set<string> mySet(&s, &s+1);

    cout << mySet.size() << " " << *mySet.begin();

    return 0;
}
intmain()
{
字符串s=“测试”;
设置mySet(&s,&s+1);

cout
std::set
没有接受要插入的元素的构造函数。最好使用范围构造函数:

int a[] = {1,2,3,4,5};
std::set<int> foo(a, a+5);  // insert the values 1 through 5 into foo
或者,在C++0x中:

    std::list<std::set<int>> foo;
    foo.push_back({1,2,3});
std::list foo;
foo.推回({1,2,3});

我认为一个可能的答案是,因为std::set不接受重复的元素,所以我认为不能插入4个元素,例如std::set(4,“string”)。但必须有一种方法至少插入一个。@Dave17:它的工作原理与Kristo的post.std::set的相同。它有一个接受开始和结束迭代器的ctor,用于初始化新集合的内容。我只是告诉编译器假装&s+1指向数组中的第二个元素。这有点小技巧,但对与Kristo的代码起作用的原因相同——指向最后一个元素的指针永远不会被取消引用。这有意义吗?
&s+1
s
之后生成下一个地址。如果
s
是数组,这将是合法的,但在这种情况下,我认为这是未定义的行为。因此它似乎只能正常工作。@Kristo:是的,我被拒绝了我自己也在抱怨。如果是这样的话,我准备接受否决票,但我仍然不确定。毕竟,你也在做同样的事情:
std::set foo(&a[0],&a[5]);
&a[5]不存在。这种用法在整个STL中很常见。这不是未定义的行为,因为地址
&a[5]
是经过计算的(可能是因为每个元素的大小在编译时是已知的),但没有取消引用。我不知道
&a[5]
可以合法,但同时
&s+1
不合法?@Kristo:换句话说,
&s
类似于指向数组的指针——一个包含1个元素的数组。@Kristo:John Dibling提出了一个问题,以澄清它是否是未定义的行为。底线-单个对象可以被视为一个元素的数组为了实现指针运算:这也可以实现foo.push_-back(set({“foo”,“bar”,“quzz”}));
    std::list<std::set<int>> foo;
    foo.push_back({1,2,3});