【问题标题】:How to convert vector to set?如何将矢量转换为集合?
【发布时间】:2013-12-01 21:24:05
【问题描述】:

我有一个向量,我在其中保存对象。我需要将其转换为设置。我一直在阅读关于集合的信息,但我仍有几个问题:

  • 如何正确初始化呢?老实说,一些教程说像set<ObjectName> something一样初始化它是好的。其他人说你也需要一个迭代器,比如set<Iterator, ObjectName> something

  • 如何正确插入它们。同样,只写something.insert(object) 就够了吗?

  • 如何从集合中获取一个特定的对象(例如,一个对象中有一个命名变量,等于“ben”)?

我必须将向量本身转换为集合(也就是我必须使用集合而不是向量)。

【问题讨论】:

  • set<Type> s(v.begin(), v.end()); 是最简单的方法。
  • @larsmans 不,我需要将向量完全转换为一个集合。我的代码中不能同时包含它们。
  • @sharth 不,我只能使用 set。我想说的是如何正确使用 set?
  • 这里的所有答案都涉及使用构造函数,有没有办法在已经构造好的集合上这样做?

标签: c++ vector set


【解决方案1】:

假设你有一个字符串向量,你可以将它转换成一个集合:

std::vector<std::string> v;

std::set<std::string> s(v.begin(), v.end());

对于其他类型,您必须定义 operator&lt;

【讨论】:

    【解决方案2】:

    到目前为止,所有答案都将vector 复制到set。由于您要求将vector“转换”为set,因此我将展示一种更优化的方法,将每个元素移动到set,而不是复制每个元素:

    std::vector<T> v = /*...*/;
    
    std::set<T> s(std::make_move_iterator(v.begin()),
                  std::make_move_iterator(v.end()));
    

    注意,您需要 C++11 支持。

    【讨论】:

      【解决方案3】:

      您可以通过以下方式使用向量中的对象初始化集合:

      vector<T> a;
      ... some stuff ...
      set<T> s(a.begin(), a.end());
      

      这是最简单的部分。现在,您必须意识到,为了将元素存储在集合中,您需要重载 bool operator&lt;(const T&amp;a, const T&amp; b) 运算符。同样,在一个集合中,根据运算符定义,您最多可以有一个具有给定值的元素。因此,在集合 s 中,您不能有两个元素同时 operator&lt;(a,b)operator&lt;(b,a) 都不为真。只要您知道并意识到您应该一切顺利。

      【讨论】:

        【解决方案4】:

        如果您只想将已有的元素存储在一个向量中,一个集合中:

        std::vector<int> vec;
        // fill the vector
        std::set<int> myset(vec.begin(), vec.end());
        

        【讨论】:

          【解决方案5】:

          你没有告诉我们太多关于你的对象,但假设你有一个这样的类:

          class Thing
          {
          public:
            int n;
            double x;
            string name;
          };
          

          你想把一些东西放到一个集合中,所以你试试这个:

          Thing A;
          set<Thing> S;
          S.insert(A);
          

          这失败了,因为集合是排序的,并且没有办法对事物进行排序,因为没有办法比较它们中的两个。您必须提供 operator&lt;

          class Thing
          {
          public:
            int n;
            double x;
            string name;
          
            bool operator<(const Thing &Other) const;
          };
          
          bool Thing::operator<(const Thing &Other) const
          {
            return(Other.n<n);
          }
          
          ...
          set<Thing> S;
          

          比较函数对象

          class Thing
          {
          public:
            int n;
            double x;
            string name;
          };
          
          struct ltThing
          {
            bool operator()(const Thing &T1, const Thing &T2) const
            {
              return(T1.x < T2.x);
            }
          };
          
          ...
          set<Thing, ltThing> S;
          

          要查找名称为“ben”的事物,您可以遍历集合,但如果您更具体地告诉我们您想要做什么,这将非常有帮助。

          【讨论】:

            【解决方案6】:

            如何正确初始化?

            std::set<YourType> set;
            

            唯一的条件是YourType 必须有bool operator&lt;(const YourType&amp;) const 并且可以复制(默认构造函数+赋值运算符)。对于std::vector,可复制就足够了。

            如何正确插入。

            set.insert(my_elem);
            

            如何从集合中获取特定对象(例如对象,其中有名称变量,等于“ben”)?

            这也许就是重点。如果您可以检查一个对象是否在其中或遍历整个集合,那么集合只是一堆对象。

            【讨论】:

            • 好吧,假设我们只想找到一个具有特定名称的对象。怎么做?
            • 您必须遍历整个集合,例如:std::find_if(set.begin(), set.end(), [](const YourType&amp; type) { return type.name == "value" });
            • 在这种情况下,如果这是搜索元素的唯一(或几乎唯一)方法,std::map&lt;std::string, YourType&gt; 应该更有效。
            【解决方案7】:

            创建一个集合就像创建一个向量。你在哪里

            std::vector<int> my_vec;
            

            (或其他类型,而不是int)将其替换为

            std::set<int> my_set;
            

            要将元素添加到集合中,请使用insert

            my_set.insert(3);
            my_set.insert(2);
            my_set.insert(1);
            

            【讨论】:

              猜你喜欢
              • 2013-06-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-15
              • 1970-01-01
              • 2019-01-01
              • 2023-03-03
              • 1970-01-01
              相关资源
              最近更新 更多