带有自定义比较器的C++映射未插入所有元素

问题描述 投票:0回答:2

我有以下代码:

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'
c++ comparator
2个回答
0
投票

您根据

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; 
  }
};

在线查看


0
投票

据我了解,您想将所有值

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
值的索引,位于最前面。

© www.soinside.com 2019 - 2024. All rights reserved.