【问题标题】:Insert an element to std::set using constructor使用构造函数将元素插入到 std::set
【发布时间】:2011-01-25 04:13:11
【问题描述】:

是否可以像在 std::list 的情况下一样向 std::set 插入一个新元素:

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

std::list< std::list<string> > mylist;
mylist.push_back(std::list<string>(1, "string"));

现在,mylist 在其 std::list 类型的子列表中有一个 std::string 类型的元素。

如果 std::set 是 std::list my list 的子集,您如何做同样的事情,即

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

如果你不能,那为什么不呢?

【问题讨论】:

  • 我想的一个可能的答案是因为 std::set 不接受重复元素,所以我认为你不能插入说 4 个元素,例如 std::set ( 4,“字符串”)。但必须有一种方法可以插入至少一个。

标签: c++ stl


【解决方案1】:

我认为这应该可以解决问题:

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

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

    return 0;
}

关于将&amp;s 视为数组的合法性和有效性的说明,请参阅此讨论:string s; &s+1; Legal? UB?

【讨论】:

  • @Dave17:它的工作原理与 Kristo 的帖子相同。 std::set 有一个 ctor,它接受用于初始化新集合内容的开始和结束迭代器。我只是告诉编译器假装 &s+1 指向数组中的第二个元素。有点小技巧,但它的工作原理与 Kristo 的代码工作的原因相同——指向最后一个元素的指针永远不会被取消引用。这有意义吗?
  • &amp;s+1 产生s 之后的下一个地址。如果s 是一个数组,那将是合法的,但在这种情况下,我认为这是未定义的行为。所以它只是看起来正常工作。
  • @Kristo:是的,我自己也在想这个。如果是这种情况,我准备接受对此的反对意见,但我仍然不确定。毕竟,您正在做同样的事情:std::set&lt;int&gt; foo(&amp;a[0], &amp;a[5]); &a[5] 不存在。这种用法在整个 STL 中都很常见。这不是未定义的行为,因为地址 &amp;a[5] 已评估(可能是因为每个元素的大小在编译时已知),但未取消引用。我看不出&amp;a[5] 是合法的,而&amp;s+1 是不是合法的?
  • @Kristo:换句话说,&amp;s 类似于指向数组的指针——一个包含 1 个元素的数组。
  • @Kristo:John Dibling 发布了一个问题,以澄清它是否是未定义的行为。底线 - 单个对象可以被视为一个元素的数组,用于指针运算:stackoverflow.com/questions/2405555/string-s-s1-legal-ub
【解决方案2】:

或者,在 C++0x 中:

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

【讨论】:

  • 这也有效 foo.push_back(set({"foo","bar","quzz"}));
【解决方案3】:

std::set 没有用于插入元素的构造函数。你能做的最好的就是使用范围构造函数:

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

此版本采用beginend 迭代器来描述要插入集合的范围。您也可以选择提供排序标准。这不是你想要的,但它很接近。因此,如果您将元素存储在容器 v 中,您可以像这样在列表中插入一个新集合:

list<set<string> > myList;
myList.push_back(set<string>(v.begin(), v.end()));

【讨论】:

    猜你喜欢
    • 2019-09-23
    • 2021-05-22
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多