问题是
bool operator==(const Value& other) const { return is_empty == other.is_empty; }
bool operator!=(const Value& other) const { return is_empty != other.is_empty; }
使任何值都是“相同的”。这使得行为未指定,并且可能最终合并任何接触间隔并保持先前的值(因为根据您自己的值它是“相等的” operator==
)。
让 C++ 生成一个更正确的比较:
struct Value {
explicit Value(int v) : value(v) {}
Value() : is_empty(true) {}
Value& operator+=(const Value& other) { value += other.value; return *this; }
auto operator<=>(Value const&) const = default;
bool is_empty = false;
int value = 0;
};
现在您可以使用编译器资源管理器
#include <iostream>
#include <boost/icl/interval_map.hpp>
int main()
{
namespace icl = boost::icl;
using I = icl::interval<int>;
using Value = int;
auto const a = std::make_pair(I::right_open(10, 20), Value(2));
auto const b = std::make_pair(I::right_open(15, 30), Value(3));
auto const c = std::make_pair(I::right_open(40, 50), Value(11));
icl::interval_map<int, Value> m;
m.add(a);
m.add(b);
m.add(c);
std::cout << m << "\n";
m.subtract(a);
std::cout << m << "\n";
}
印刷
{([10,15)->(2))([15,20)->(5))([20,30)->(3))([40,50)->(11))}
但是,我很难理解Value
增加了optional<int>
什么,实际上已经是 interval_map 的行为:
int main()
{
namespace icl = boost::icl;
using I = icl::interval<int>;
auto const a = std::make_pair(I::right_open(10, 20), 2);
auto const b = std::make_pair(I::right_open(15, 30), 3);
auto const c = std::make_pair(I::right_open(40, 50), 11);
icl::interval_map<int, int> m;
m.add(a);
m.add(b);
m.add(c);
std::cout << m << "\n";
m.subtract(a);
std::cout << m << "\n";
}
印刷:
{([10,15)->2)([15,20)->5)([20,30)->3)([40,50)->11)}
{([15,30)->3)([40,50)->11)}
实际上,在某些方面,您的自定义Value
方式对我来说似乎是“错误的”,即使是固定比较:
Live On 编译器资源管理器
#include <iostream>
#include <boost/icl/interval_map.hpp>
struct Value {
explicit Value(int v) : value(v) {}
Value() : is_empty(true) {}
Value& operator+=(const Value& other) { value += other.value; return *this; }
Value& operator-=(const Value& other) { value -= other.value; return *this; }
auto operator<=>(Value const&) const = default;
bool is_empty = false;
int value = 0;
friend std::ostream& operator<<(std::ostream& os, Value const& v) {
return v.is_empty ? os << "#EMPTY" : os << v.value;
}
};
int main()
{
namespace icl = boost::icl;
using I = icl::interval<int>;
auto const a = std::make_pair(I::right_open(10, 20), Value(2));
auto const b = std::make_pair(I::right_open(15, 30), Value(3));
auto const c = std::make_pair(I::right_open(40, 50), Value(11));
icl::interval_map<int, Value> m;
m.add(a);
m.add(b);
m.add(c);
std::cout << m << "\n";
m.subtract(a);
std::cout << m << "\n";
}
印刷
{([10,15)->2)([15,20)->5)([20,30)->3)([40,50)->11)}
{([10,15)->0)([15,30)->3)([40,50)->11)}
真的[10,15)->0
是有意的,想要的吗?