- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我有一个包含 N 个大小相同的 vectors
的类。我将如何实现一个标准的迭代器模板,该模板将在 1 到 N 个 vector 之间迭代。我写了一个小例子来演示这个问题。
#include <bitset>
#include <tuple>
#include <type_traits>
#include <vector>
//Since std::get<>() for types isn't in c++11, I use this meta-function to determine the index
//of a Type in a list of Types, starting from 0. ex: IndexOf<C, A, B, C>::value = 2
template <typename T, typename... Ts>
struct IndexOf;
template <typename T, typename... Ts>
struct IndexOf<T, T, Ts...> : std::integral_constant<std::size_t, 0> {};
template <typename T, typename U, typename... Ts>
struct IndexOf<T, U, Ts...> : std::integral_constant<std::size_t, 1 + IndexOf<T, Ts...>::value> {};
//Used to determine the slot we're interesting in.
using Handle = const std::size_t;
template<typename... Types>
class DataManager
{
static constexpr std::size_t TypeCount = sizeof... (Types);
using Flags = std::bitset<TypeCount>; //BitMask to determine if the handle has a certain piece of data initialized
std::size_t count, capacity;
std::tuple<std::vector<Types>..., std::vector<Flags>> vectors; //Tuple of vectors, holding the types and flags.
public:
DataManager(std::size_t n) : count(0), capacity(n),
vectors(std::make_tuple(std::vector<Types>(n)..., std::vector<Flags>(n)))
{}
template <typename Type, typename... Args>
void add(Handle handle, Args&&... args) { //Initializes the type in the handle slot of the vector
Flags& flags = std::get<TypeCount>(vectors)[handle]; //Flag the bit, notify that handle
flags.set(IndexOf<Type, Types...>::value); //has that piece of data initialized
std::get<IndexOf<Type, Types...>::value>(vectors)[handle] = Type{ args... };
}
template <typename Type>
Type& get(Handle handle) { //Returns the Type in handle slot of the vector
return std::get<IndexOf<Type, Types...>::value>(vectors)[handle];
}
template <typename Type>
bool has(Handle handle) { //Returns true if the Type is initialized, by checking the bitset
Flags& flags = std::get<TypeCount>(vectors)[handle];
return flags.test(IndexOf<Type, Types...>::value);
}
Handle push_back() {
return count++;
}
};
我目前使用它来访问数据:
//Simple Data
struct D0 { int x, y; };
struct D1 { float n, m; };
struct D2 { int x, y, z; };
int main()
{
DataManager<D0, D1, D2> manager(100);
Handle h0 = manager.push_back();
std::cout << manager.has<D0>(h0) << std::endl; //prints false, h0 doesn't have D0 initialized
manager.add<D0>(h0, 75, 20); //initialize D0 for h0
std::cout << manager.has<D0>(h0) << std::endl; //prints ture, h0 is now initialzed
std::cout << manager.get<D0>(h0).x << std::endl; //prints 75
}
我如何向 DataManager 类添加迭代器功能,它只会像这样迭代选定的数据?
int main()
{
...
for (D0 d1, D3 d3 : manager) {
... //Iterate over all D0s and D3s between 0 and count
}
//or
for(DataManager<D0>::iterator it = v.begin(); it != v.end(); ++it {
... //Iterate over just D0s between 0 and count - 10
}
}
最佳答案
编写范围 View 类型。范围 View 有两个迭代器,一个开始和一个结束,并公开 .begin()
和 .end()
。返回迭代器的范围 View 可让您在不复制任何内容的情况下执行 for(:)
循环。
接下来您需要一个遍历所选元素的迭代器。我可以想到两种方法。
首先,一个 zip 迭代器。一个 zip 迭代器有一个迭代器元组,并并行推进它们。当您取消引用时,它会返回每个迭代器的取消引用的 std::tie
。
第二个选项,生成器迭代器。生成器迭代器有一个索引,以及一个从索引映射到某种类型的函数。 ++
和 ==
等只是推进/比较索引。 *
返回函数调用的结果。在这种情况下,您将从该函数返回 tie
。
我通常通过从索引迭代器(存储索引,*
返回它的拷贝)开始实现生成器迭代器,然后编写转换迭代器(存储迭代器,将 ==
和 ++
等转发给它,存储一个函数 f
,并且在 *
上执行 f(*it)
,其中 it
是存储的迭代器)。生成器迭代器现在只是一个 transform_iterator<F(index_iterator)>
。
由于围绕 ::reference
类型等的规则,这些都有效地限于满足输入迭代器的公理。但是,输入迭代器足以执行 for(:)
循环;此外,for(:)
循环甚至不需要合法的迭代器,因为它是根据代码而非迭代器语义定义的。
生成器/转换迭代器就足够了,而且两者在其他情况下都很有用,所以我会采用这种方法。
如果需要,您可以选择类型删除转换(转换为 std::function< T(std::size_t) >
)。
template<class T>
using any_generator_iterator = transform_iterator< std::function<T(std::size_t)>( indexing_iterator ) >;
现在迭代类型 A B 和 C 我们这样做:
template<class...Ts,
class R=std::tuple<Ts&...>,
class It=any_generator_iterator<R>
>
range_view< It >
iterate_over() {
auto get = [this](std::size_t i)->R {
return std::tie( this->get<Ts>()... );
};
return { {get, 0}, {{}, count} };
}
别处:
for( auto i : foo.iterate_over<A,B,C>() ) {
auto&& a = std::get<0>(i);
auto&& b = std::get<1>(i);
auto&& c = std::get<2>(i);
// code
}
上面有一堆库代码。
大部分(如果不是全部)已在 boost
中解决。
关于c++ - 如何为其中包含 N 个 vector 的类实现子集迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40897011/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!