【问题标题】:Add element from set of strings to vector of set of strings将字符串集合中的元素添加到字符串集合的向量
【发布时间】:2019-11-11 16:58:10
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ vector set emplace


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    1. 为什么我收到错误::const_reference = const std::basic_string&lt;char&gt;&amp;]' cannot be overloaded.

    因为您正在尝试使用一组 const。 const 类型不满足std::set 的类型要求。请改用std::vector&lt;std::set&lt;std::string&gt;&gt;

    1. 我试图从 player_cards 声明中删除 const 但后来我得到了no matching function for call to 'std::set&lt;std::basic_string&lt;char&gt; &gt;::set(const std::basic_string&lt;char&gt;&amp;)

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

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

    auto init = {*it};
    player_cards.emplace_back(init);
    
    1. 当我执行emplace_back(*it); 时,它必须被取消引用吗?

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

    1. ...我需要先创建一个迭代器指向的元素的集合吗?

    emplace_back 就是这样做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-19
      • 2021-11-09
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多