类类型的集合

时间:2011-01-02 23:33:44

标签: c++ stl

您是否可以编写一个重载函数来删除设置中的DATA对象,例如:s.erase(4)此处4可以是值或x或y。

struct DATA
{
   DATA(int X, int Y):x(X), y(Y){}
   int x;
   int y;

   bool operator < (const DATA &d) const
   {
       return x < d.x || (x == d.x && y < d.y);
   }
};


int main()
{
   set <DATA> s;

   for (int i = 0; i < 5; i++)
      s.insert(DATA(i, i+5));

   s.erase(0) // remove where x = 0
}

5 个答案:

答案 0 :(得分:2)

当然!

您可以编写一个仿函数来搜索EITHER x或y为4的集合元素,并删除这些元素。您需要boost::bind来简化绑定:

#include <set>
#include <algorithm>
#include <boost/bind.hpp>

struct Foo {
    int x, y;

    bool operator<(const Foo& rhs) const {
        return (x < rhs.x || (x == rhs.x && y < rhs.y));
    }

    bool hasValue(int v) const {
        return (x == v || y == v);
    }
};

int main()
{
    std::set<Foo> s;
    Foo a = {4,2}; s.insert(a);
    Foo b = {3,4}; s.insert(b);

    std::cout << s.size() << std::endl; // will output: "2"

    std::set<Foo>::iterator it;

    // Search for an element with the given value '4' in either x or y
    // Erase first matching element found, if any
    // (our first element, which has x=4)
    it = std::find_if(s.begin(), s.end(), boost::bind(&Foo::hasValue, _1, 4));
    if (it != s.end())
        s.erase(it);

    std::cout << s.size() << std::endl; // will output: "1"

    // Erase the next one
    // (our second element, which has y=4)
    it = std::find_if(s.begin(), s.end(), boost::bind(&Foo::hasValue, _1, 4));
    if (it != s.end())
        s.erase(it);

    std::cout << s.size() << std::endl; // will output: "0"
}

尚未对拼写错误进行过广泛测试。

使用以Foo*作为参数的静态成员函数,您可以在不使用boost的情况下获得相同的功能。

答案 1 :(得分:2)

答案 2 :(得分:0)

没有;您的设置按X排序,您也不能通过Y订购该设置以便通过它进行删除。您需要遍历该集以查找要删除的项目,然后将其删除,就像通常从集合中删除一样。

答案 3 :(得分:0)

当然 - 您可以修改数据结构以在更大的整数类型上操作,并使用位移来打包一对较小的整数类型。但是,从更一般的意义上说,然后没有。有多个索引的容器,但std :: set不是其中之一。

答案 4 :(得分:0)

std::map容器怎么样?您可以使用x或y作为key_type,并将类中的非键值保存为value_type。