- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建两个类 Collection
和 CollectionView
,它是 Boost.MultiIndex 之上的抽象。这个想法有点简单:给 CollectionView 一个 Collection 类型的实例,它会处理渲染。 Collection 添加了一个用于添加或删除项目的接口(interface),这反过来将向 CollectionView 发出信号,表明它需要做一些工作。
类的摘录如下所示:
template<class ItemType, typename ... Indexes>
struct Collection {
using t_container = multi_index_container<ItemType, indexed_by<Indexes...>>;
t_container itemSet;
}
template<class TCollectionType>
struct CollectionView {
// Imagine that this view also keeps track of which
// item in col corresponds to which item on the screen
TCollectionType& col;
}
这个想法是 API 的用户可以完全控制可以索引哪些列,并且在编译时尽可能多地验证其正确性。
struct CollectionView {
t_index_type currentIndex { col.itemSet.get<0>() }
void Build() {
for (const auto& item : currentIndex) {
// Do stuff here
}
}
}
我不知道是什么,如果有的话,
t_index_type
可能是,因为每个索引(sequenced、ordered_non_unique 等)都有自己的类型。我可以强制用户实现
void Iterate(function<void(const ItemType&>)
, 但这会给 API 的用户带来更多的代码。
// Previous definitions omitted
struct Collection {
using t_callback_fn = std::function<void(const ItemType&)>;
using t_iter_fn = std::function<void(t_callback_fn)>;
void Iterate(t_callback_fn cb) const
{
iterFn(cb);
}
template<int N, bool reverse = false>
void SetSortIndex()
{
iterFn = [this](t_callback_fn fn) {
// The ideal would be to store this index as part of the class itself!
auto& index = itemSet.template get<N>();
if (reverse) {
for (auto it { index.rbegin() }; it != index.rend(); ++it)
fn(*it);
} else {
for (const auto &item : index)
fn(item);
}
};
}
}
并使用容器:
col.SetSortIndex<0, true>;
col.Iterate([](const auto& it) { std::cout << it << '\n;};
但这不是很好。
最佳答案
听起来您真的会得到 random_access_index
的服务。来自 Boost Multi Index (BMI)。
您可以rearrange it以您希望的任何方式。因此,即使您想让用户手动重新排列事物,例如他们
As an aside: note that you can also use BMI containers to merely index non-owned or shared elements. The implementation allows the element type to be T*, T const*, std::reference_wrapper, shared_ptr etc. without any other change to the functionality. Note that it uses generic
pointer_traits
for this so you can even usestd::reference_wrapper<std::shared_ptr<T const*> >
and it would still work.This is not related to the answer but does resonate with the concept of "external views" as you were contemplating.
random_access
透明地索引到您的容器中:
template<class ItemType, typename ... Indexes>
class Collection {
template <typename> friend struct CollectionView;
struct View;
using t_container = bmi::multi_index_container<ItemType,
bmi::indexed_by<
Indexes...,
bmi::random_access<bmi::tag<View> > // additional!
>
>;
private:
t_container itemSet;
};
现在我们可以定义 View 来处理那个额外的索引:
template<class TCollectionType>
struct CollectionView {
using MIC = typename TCollectionType::t_container;
using Tag = typename TCollectionType::View;
using Index = typename MIC::template index<Tag>::type;
TCollectionType& col;
Index& idx { col.itemSet.template get<Tag>() };
// Imagine that this view also keeps track of which
// item in col corresponds to which item on the screen
//
explicit CollectionView(TCollectionType& col) : col(col) {}
auto begin() const { return idx.begin(); }
auto end() const { return idx.end(); }
};
现在,我将添加一些排列函数,它们都通过一些现有索引进行排列:
template <int n> void arrange_by() {
idx.rearrange(col.itemSet.template get<n>().begin());
}
或通过用户指定的免费比较功能进行排列:
template <typename Cmp> void arrange_by(Cmp cmp) {
std::vector<std::reference_wrapper<T const> > v(idx.begin(), idx.end());
std::sort(v.begin(), v.end(), cmp);
idx.rearrange(v.begin());
}
Live On Coliru
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <boost/multi_index/member.hpp>
#include <iostream>
#include <iomanip>
namespace bmi = boost::multi_index;
template<class ItemType, typename ... Indexes>
class Collection {
template <typename> friend struct CollectionView;
struct View;
using t_container = bmi::multi_index_container<ItemType,
bmi::indexed_by<
Indexes...,
bmi::random_access<bmi::tag<View> > // additional!
>
>;
public:
explicit Collection(std::initializer_list<ItemType> init) : itemSet(init) {}
bool insert(ItemType const& item) {
return itemSet.insert(item).second;
}
template <int index = 0, typename K>
bool erase(K const& key) {
return itemSet.template get<index>().erase(key);
}
private:
t_container itemSet;
};
template<class TCollectionType>
struct CollectionView {
using MIC = typename TCollectionType::t_container;
using T = typename MIC::value_type;
using Tag = typename TCollectionType::View;
using Index = typename MIC::template index<Tag>::type;
TCollectionType& col;
Index& idx { col.itemSet.template get<Tag>() };
// Imagine that this view also keeps track of which
// item in col corresponds to which item on the screen
//
explicit CollectionView(TCollectionType& col) : col(col) {}
template <int n> void arrange_by() {
idx.rearrange(col.itemSet.template get<n>().begin());
}
template <typename Cmp> void arrange_by(Cmp cmp) {
std::vector<std::reference_wrapper<T const> > v(idx.begin(), idx.end());
std::stable_sort(v.begin(), v.end(), cmp);
idx.rearrange(v.begin());
}
auto begin() const { return idx.begin(); }
auto end() const { return idx.end(); }
};
/// example application
struct Item {
int id;
std::string name;
// some natural ordering just for demo
bool operator<(Item const& other) const
{ return std::tie(id, name) < std::tie(other.id, other.name); }
bool operator>(Item const& other) const
{ return std::tie(id, name) > std::tie(other.id, other.name); }
};
using Items = Collection<Item,
bmi::ordered_unique<bmi::member<Item, int, &Item::id> >,
bmi::ordered_unique<bmi::member<Item, std::string, &Item::name> > >;
int main() {
Items items {
{ 3, "three" },
{ 1, "one" },
{ 5, "five" },
{ 4, "four" },
{ 2, "two" },
{ 6, "six" },
};
CollectionView view(items);
auto dump = [&view](auto caption) {
std::cout << std::setw(12) << caption << ": ";
for (auto const& [id, name] : view)
std::cout << " { " << id << ", " << std::quoted(name) << " }";
std::cout << "\n";
};
dump("default");
view.arrange_by<1>(); // by name
dump("by name");
view.arrange_by<0>(); // by id
dump("by id");
view.arrange_by(std::less<Item>{});
dump("std::less");
view.arrange_by(std::greater<Item>{});
dump("std::greater");
auto funky = [](Item const& a, Item const& b) {
return (a.name.length() - a.id) < (b.name.length() - b.id);
};
view.arrange_by(funky);
dump("funky");
// mutations are fine
if (items.erase(1))
std::cout << "Removed 1\n";
dump("funky");
if (items.insert(Item { 42, "answer" }))
std::cout << "Inserted the answer (appears at end)\n";
dump("funky");
view.arrange_by<1>();
dump("by name");
}
打印
default: { 3, "three" } { 1, "one" } { 5, "five" } { 4, "four" } { 2, "two" } { 6, "six" }
by name: { 5, "five" } { 4, "four" } { 1, "one" } { 6, "six" } { 3, "three" } { 2, "two" }
by id: { 1, "one" } { 2, "two" } { 3, "three" } { 4, "four" } { 5, "five" } { 6, "six" }
std::less: { 1, "one" } { 2, "two" } { 3, "three" } { 4, "four" } { 5, "five" } { 6, "six" }
std::greater: { 6, "six" } { 5, "five" } { 4, "four" } { 3, "three" } { 2, "two" } { 1, "one" }
funky: { 4, "four" } { 2, "two" } { 3, "three" } { 1, "one" } { 6, "six" } { 5, "five" }
Removed 1
funky: { 4, "four" } { 2, "two" } { 3, "three" } { 6, "six" } { 5, "five" }
Inserted the answer (appears at end)
funky: { 4, "four" } { 2, "two" } { 3, "three" } { 6, "six" } { 5, "five" } { 42, "answer" }
by name: { 42, "answer" } { 5, "five" } { 4, "four" } { 6, "six" } { 3, "three" } { 2, "two" }
关于c++ - 存储指向 Boost MultiSet 索引的引用/指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62621979/
这几天我一直在努力。我一直在自学 CSS,所以对菜鸟好一点。我正在创建一个推荐 slider 。推荐以 3 个 block 显示。我希望前 2 个下降,第 3 个上升。但是当 slider 激活时,无
我最近开始学习 Nodejs,现在我很困惑我的网络应用程序使用什么,html 还是 ejs (Express)。 Ejs 使用 Express 模块,而 .html 使用 HTML 模块。我的第一个问
假设我们有一个 PostgreSQL 表contacts,每条记录都有一堆带标签的电子邮件地址(标签和电子邮件对)——其中一个是“主要”。 存储方式如下: id 主键 电子邮件 文本 email_la
我成功为一种新的tesseract语言编写了traineddata文件,但是当我完成时,我继续收到以下错误: index >= 0 && index = 0 && 索引 < size_used_ :E
这个问题已经有答案了: How to deal with SettingWithCopyWarning in Pandas (21 个回答) 已关闭 4 年前。 假设我有一个像这样的数据框,第一列“密
如果我有一个位置或行/列同时用于 A 和 B 位置,请检查 B 是否与 A 成对角线? 1 2 3 4 5 6 7 8 9 例如,我如何检查 5 是否与 7 成对角线? 此外,如果我检查 4 是
MongoDB:索引 一、 创建索引 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引 > db.user.getIndexes() [ { "v
一、索引介绍 索引是一种用来快速查询数据的数据结构。 B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。 MongoDB不使用索引
我无法决定索引。 就像我有下面的查询需要太多时间来执行: select count(rn.NODE_ID) as Count, rnl.[ISO_COUNTRY_CODE] as Cou
我有这些表: CREATE TABLE `cstat` ( `id_cstat` bigint(20) NOT NULL, `lang_code` varchar(3) NOT NULL,
我正在尝试找到一种方法来提高包含 IP 范围的 mysql 表的性能(在高峰时段每秒最多有 500 个 SELECT 查询(!),所以我有点担心)。 我有一个这种结构的表: id smallint(
jquery index() 似乎无法识别元素之一,总是说“无法读取未定义的属性‘长度’”这是我的代码。mnumber 是导致问题的原因。我需要 number 和 mnumber 才能跟踪使用鼠标,并
我们有一个包含近 4000 万条记录的 MongoDB 集合。该集合的当前大小为 5GB。此集合中存储的数据包含以下字段: _id: "MongoDB id" userid: "user id" (i
文档说:如果你有多个字段的复合索引,你可以用它来查询字段的开始子集。所以如果你有一个索引一个,乙,丙你可以用它查询一种一个,乙a,b,c 我的问题是,如果我有一个像这样的复合索引一个,乙,丙我可以查询
我正在使用 $('#list option').each(function(){ //do stuff }); 循环列表中的选项。我想知道如何获取当前循环的索引? 因为我不想让 var i = 0;循
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL
SQLite 索引(Index) 索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。
我是 RavenDB 的新手。我正在尝试使用多 map 索引功能,但我不确定这是否是解决我的问题的最佳方法。所以我有三个文件:Unit、Car、People。 汽车文件看起来像这样: { Id: "
我有以下数据,我想根据范围在另一个表中建立索引 我想要实现的是,例如,如果三星的销售额为 2500,则折扣为 2%,低于 3000 且高于 1000 我知道它可以通过索引来完成,与多个数组匹配,然后指
我正在检查并删除 SQL 数据库中的重复和冗余索引。 所以如果我有两个相同的索引,我会删除。 例如,如果我删除了重叠的索引... 索引1:品牌、型号 指标二:品牌、型号、价格 我删除索引 1。 相同顺
我是一名优秀的程序员,十分优秀!