将字符串集中的元素添加到字符串集的向量

Add element from set of strings to vector of set of strings

我想为下面的练习做一个操作,我试图将一组字符串中的一个元素添加到一组字符串的向量中。

#include <iostream>
#include <set>
#include <vector>

int main() {

    std::set<std::string> remaining_cards = {"2S", "3S", "4S", "5S", "6S"};
    std::vector<std::set<const std::string>> player_cards;

    int random_number;
    random_number=2;

    auto it = remaining_cards.cbegin();
    std::advance(it, random_number);
    std::cout << *it << std::endl;
      // add one element to a vector of sets of strings from set of strings
    player_cards.emplace_back(*it);
    // remove that element from the original set
    remaining_cards.erase(it);

    return 0;
}

我有以下问题:

  1. 为什么会出现错误 ::const_reference = const std::basic_string<char>&]' cannot be overloaded.
  2. 我试图从 player_cards 声明中删除 const 但后来我得到 no matching function for call to 'std::set<std::basic_string<char> >::set(const std::basic_string<char>&)
  3. 当我执行 emplace_back(*it); 时,是否必须取消引用 it
  4. 我怀疑我的问题是因为我试图将一个集合的元素放入一个字符串集合的向量中。我是否需要先为迭代器指向的元素创建一个集合?我假设它只指向一个字符串。
  5. 难道emplace_back没有直接创建集合的能力吗?
  6. 我可以做类似 emplace_back(std::set(*it));
  7. 的事情吗

以上所有内容可能在概念上都是错误的,因为我是 c++ 的新手,但我试图了解将元素从集合添加到集合向量的最佳方法是什么。好像比想像的要复杂

  1. Why do I get the error ::const_reference = const std::basic_string<char>&]' cannot be overloaded.

因为你正在尝试使用一组常量。 Const 类型不满足 std::set 的类型要求。请改用 std::vector<std::set<std::string>>

  1. I tried to remove the const from the player_cards declaration but then I get no matching function for call to 'std::set<std::basic_string<char> >::set(const std::basic_string<char>&)

it 是一个指向 std::string 的迭代器。如果你看一下 std::set 的构造函数,你会发现它没有将字符串作为参数的构造函数。

有一个构造函数采用 std::initializer_list。不幸的是,由于复杂的原因,它不能直接与 emplace_back 一起使用。但它可以与辅助变量一起使用:

auto init = {*it};
player_cards.emplace_back(init);
  1. When I do emplace_back(*it); does it have to be dereferenced?

鉴于emplace_back(*it);emplace_back(it);都不行,这个问题有点不清楚。您必须通过迭代器间接访问指向的元素。如果你不需要访问指向的元素,那么你不需要通过迭代器间接访问。

  1. ... Do I need to create a set first of the element that the iterator points to?

这就是 emplace_back 的作用。

class 模板 std::set 中没有接受对类型 value_type 对象的引用的构造函数。但是有一个构造函数接受例如初始化列表。你可以写

player_cards.emplace_back( std::set<std::string>( { *it } ) );