我有以下代码:
enum Type {
OUTPUT = 1,
INPUT = 2,
INOUT = 3
};
std::vector<int> data = {INPUT, INOUT, OUTPUT, INPUT, OUTPUT, INPUT}
我的目标是将信息存储到
std::map<int, char>
中,其中键是data
中的索引,值是某个字符。我希望它的排序方式是那些在 data
中具有值 INPUT
的索引将位于开头。
我尝试编写一个自定义比较器:
struct Comparator {
bool operator()(int lhs, int rhs) {
if (data[lhs] == INPUT && data[rhs] != INPUT) {
return true;
} else if (data[lhs] != INPUT && data[rhs] == INPUT) {
return false;
}
return data[lhs] < data[rhs]
}
};
但是对于下面的代码
int main()
{
std::map<int, char, Comparator> m;
for (unsigned i = 0; i < data.size(); ++i) {
m.insert( {i, 'a' + i} );
}
}
我的地图的值为
0 -> 'a'
2 -> 'c'
1 -> 'b'
您根据
data
中存储的值进行排序,而您只存储了3个值,因此您最多只能在地图中获取3个值。
您的订购应该基于
lhs
和rhs
,而不是data[lhs]
/data[rhs]
:
struct Comparator {
bool operator()(int lhs, int rhs) const /* note the const here */ {
if (data[lhs] == INPUT && data[rhs] != INPUT) {
return true;
} else if (data[lhs] != INPUT && data[rhs] == INPUT) {
return false;
}
// either both are INPUT or both are not,
// so compare lhs and rhs, not the values in data
return lhs < rhs;
}
};
据我了解,您想将所有值
k
放在前面,其中data[k]==INPUT
。如果这是准确的那么...
你的比较器是错误的,如果两者都等于
INPUT
,你就没有正确的值。一个简单的比较器将从以下开始:
if (data[lhs] == INPUT) { // INPUT < anything
return true;
}
if (data[rhs] == INPUT) { // INPUT can not be > anything
return false;
}
这样,任何
k
的 data[k]==INPUT
将被视为小于任何其他元素,并且将位于开头。
一个可能的代码可以是:
#include <map>
#include <iostream>
#include <vector>
enum Type {
OUTPUT = 1,
INPUT = 2,
INOUT = 3
};
std::vector<int> data{INPUT, INOUT, OUTPUT, INPUT, OUTPUT, INPUT};
struct Comparator {
bool operator()(const int &lhs, const int &rhs) const {
if (data[lhs] == INPUT) {
return true;
}
if (data[rhs] == INPUT) {
return false;
}
return data[lhs] < data[rhs];
}
};
int main()
{
std::map<int, char, Comparator> m;
for (unsigned i = 0; i < data.size(); ++i) {
m.insert( {i, 'a' + i} );
}
for (auto it = m.begin(); it != m.end(); it++) {
std::cout << it->first << ':' << it->second << std::endl;
}
}
并且会给出:
5:f
3:d
0:a
2:c
1:b
5,3,0是
INPUT
值的索引,位于最前面。