您是否可以编写一个重载函数来删除设置中的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
}
答案 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。