key_struct kStruct;
kStruct.x = 2;
std::find_if(m_cueCommands.begin(), m_cueCommands.end(), find_MyInt(kStruct));
struct key_struct
{
int x;
string y;
string z;
}
struct find_myInt : std::unary_function<key_struct, bool>
{
int x;
find_myInt(key_struct kStruct):myInt(kStruct.x){}
bool operator()(key_struct const& m) const
{
return m.x == myInt;
}
};
我很确定我有点搞砸了但是,我认为这是非常接近的。我想要做的是将key_struct作为我地图中的键。我希望能够搜索密钥并返回我设置key_struct的信息。如果我用x = 2设置key_struct,那么我只想返回int x等于2的位置。如果我设置x = 2和y =“testString”,那么我想只返回x的值的子集= 2且y =“testString”。
我相信我的方法很接近,但我认为我错过了一些东西。想法?
答案 0 :(得分:2)
你总是想和x比较吗?或者仅当x!= 0?
顺便说一下,你的struct构造函数中似乎有一个错误:没有名为myInt
的成员,因此它应该是:find_myInt(key_struct kStruct) : x(kStruct.x){}
。但这无关紧要,无论如何都需要改变。
这是我会尝试的。这是未经测试的,可能包含错误,并且布尔返回值的“计算”效率极低。总之...
要使用它,请创建一个您想要匹配的结构,正如您从代码中看到的那样,它只会尝试匹配x > 0, y != "" and z != ""
。因此,如果您将“搜索”结构设置为x = 5, y = "" and z = ""
,它将匹配x == 5
(y&amp; z可以是其他)的每个键。
typedef std::pair<key_struct, your_value_type> yourMapType;
struct find_myStruct : std::unary_function<key_struct, bool>
{
private:
key_struct myStruct;
public:
find_myInt(key_struct const & kStruct): myStruct(kStruct) {}
bool operator() (yourMapType const & m) const
{
bool result = true;
if (myStruct.x > 0)
result &= (myStruct.x == m.first.x);
if (myStruct.y != "")
result &= (myStruct.y == m.first.y);
if (myStruct.z != "")
result &= (myStruct.z == m.first.z);
return result;
}
};
[编辑] 注意到您要使用地图,因此我会相应地更新代码。仍然非常未经测试,随意指出错误。
[编辑2] 如果您在实际创建地图时遇到问题,因为您的key_struct没有严格的弱排序,那么应该这样做。
同样,未经测试,可能包含错误。对于所有if
来说效率也很低,但是很好......随时可以使用您最喜欢的卡诺地图解算器(BMin)来了解它们。
struct cmp_key_struct
{
bool operator() (key_struct const & lhs, key_struct const & rhs) const
{
bool result = (lhs.x < rhs.x);
if ((!result) && (lhs.x == rhs.x))
{
result = (lhs.y < rhs.y);
if ((!result) && (lhs.y == rhs.y))
result = (lhs.z < rhs.z);
}
return result;
}
};
std::map<key_struct, your_value_type, cmp_key_struct> yourMap;
答案 1 :(得分:0)
您无需在地图上使用find_if
。如果您尝试将结构用作地图键,正如您所说,您需要一个提供“strict weak ordering”的比较。使用“&lt;”例如,而不是“==”。然后提供与地图的比较。或者重载结构中的<
运算符。您可以使用[]
运算符或find()
map
方法进行O(log n)搜索,其中find_if
为O(n)。
答案 2 :(得分:0)
这是更正版本:
struct find_myInt : std::unary_function<key_struct, bool>
{
int myInt; /// HERE
find_myInt(key_struct kStruct):myInt(kStruct.x){}
bool operator()(key_struct const& m) const
{
return m.x == myInt;
}
};