- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个这样的容器:
// Sort functor
struct SortByTime :
std::binary_function<const TimeSortableData &, const TimeSortableData &, bool>
{
bool operator()(const TimeSortableData & a, const TimeSortableData & b) const
{
return a.GetTime() < b.GetTime();
}
};
// Container that sorts by time
typedef std::multiset<TimeSortableData, SortByTime> TimeSortedData;
现在,如果我想获取时间 t
之前的最后一个数据对象,我可以创建一个虚拟对象并调用 upper_bound()
:
TimeSortableData dummy(t);
TimeSortedData::const_iterator it = mySortedData.upper_bound(dummy);
--it;
// result = *it;
这给了我对数搜索的复杂性。
除了看起来笨拙之外,如果这样的虚拟对象很难创建(不是关于运行时性能,而是编码工作量),这种方法也会有问题。
我看过 std::multiset::key_comp
但我不知道如何使用它..std::multiset::find()
和 std::binary_search()
都希望我给他们容器的 key_type
,即 TimeSortableData
对象...
如何在不创建虚拟对象的情况下进行高效搜索?
评论更新:
还有 find_if()
:它会让我省去创建虚拟对象的工作,但代价是 O(n) 的复杂性。
最佳答案
我想如果您的 key 的构建成本如此之高以至于您担心创建一个临时的虚拟 key ,您可以随时更改您的代码以使用 std::multimap
代替。让 key 是构造成本较低的东西,例如整数或 time_t
或 GetTime()
返回的任何内容,然后 data_type
可以是更大的数据。
typedef std::multimap<time_t, TimeSortableData> TimeSortedData;
TimeSortedData mySortedData;
...
time_t dummy = [whatever];
TimeSortedData::const_iterator it = mySortedData.upper_bound(dummy);
if (it != mySortedData.begin()) --it; // Check that iterator isn't at beginning
result = it->second;
关于c++ - 如何在不构造 key_type 对象的情况下在 std::multiset 中进行二进制搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3772640/
我正在制作一款带有简单库存系统的视频游戏。我正在尝试做到这一点,以便每当您按下“Z”键时,它都会显示或隐藏库存 GUI。我不知道为什么,但是 KEY_TYPED 按键事件不起作用。 KEY_PRESS
我有一个带有许多文本字段的Java应用程序,我可以通过按`然后按e输入例如é。这是许多应用程序中已知的行为。 现在,在特定的用户操作(启动应用程序的特定模块)之后,应用程序中的所有文本字段将无法键入
我有一个 KeyboardFocusManager 具有覆盖的 dispatchKeyEvent() 方法来处理箭头键和输入的导航。只要按键被按下,我就需要处理按键事件。不幸的是,按住 enter 会
我一直在尝试通过重写书中的问题来学习按键绑定(bind),这些问题是我之前使用 KeyListener 解决的。我正在努力使用按键绑定(bind)解决的问题需要我记录已输入的消息并将其显示在面板上。
我编写这段代码是为了检查 std::map 是否存在包含一个特定的键: template inline bool contains(const std::map& map, const T& valu
我有一个类模板 ID ,目前使用对象的地址作为其标识符。 我想对此类模板进行专门化,这样如果 T有一个 key_type定义,我会调用get_key()在对象上并将其用作标识符。当然,我也会存储那个值
我有一个在标准容器上运行的 X 类。以 value_type 作为参数的函数必须调用以 key_type 作为参数的函数。我怎么做?我看起来很基础。 template class X { void
std::map::find接受 const key_type&作为论据。这样,它要求参数可转换为 key_type .这对我来说似乎是一个疏忽,因为该参数不必可转换为key_type。 ,它只需要与
我正在尝试创建一个以 xercesc::XMLUri 作为键类型的 std::unordered_map。 #include #include "xercesc/util/XMLUri.hpp" i
我想出了以下代码,它演示了一种在 STL 集合上进行通用迭代并获取键值的技术,而不管键的存储方式如何。 这里的上下文是我正在重构两个函数,它们都在两个集合上运行相同的功能:一个是 set另一个是 ma
我有一个这样的容器: // Sort functor struct SortByTime : std::binary_function { bool operator()(const Ti
我在 std::map 中自定义比较,如下所示。 class my_cmp { public: bool operator()(const string &a, const string &b)
我有一张 map : std::map myMap; 但是,在某些情况下,我想通过比较 TyString == TyStringRef 来std::map::find 一个条目,即 myMap.fin
我对以下 C 代码行感到有点困惑: typedef void* key_type; 这是否意味着 key_type 是一个空指针?我想这是比 C 编程中的 void* 更直观的命名。 - 谢谢 最佳答
这是我对 Box 类的实现: class Box { friend ostream& operator bmap; bmap.insert(pair(b1, 10)); bma
最近去使用std::unordered_map::erase,发现函数有一些重载: Link to cppreferences iterator erase( const_iterator pos )
我正在跟踪一个错误,但遇到了非常奇怪的行为。我有一组指针,当我一个一个地删除它们时,第一个删除,但删除另一个给我段错误。我用 size_type erase( const key_type& k
I am thinking from Java help:The complete reference(8th Ed) by Herbert Schildt to learn about Java.在
这是我的情况的说明。我有一个 std::map我想找到第一个 pair其中 key 是 key 等价类的任何成员。 #include struct Category { int foo;
我有一个类(class)目录类,它有一个 map Courses 类型的私有(private)变量.我想重载 ,你可以重载 <<对于 CourseInfo : std::ostream& operat
我是一名优秀的程序员,十分优秀!