- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有一个类似容器的抽象类,名为 RuleBook
。 RuleBook
的用户希望能够对 RuleBook
进行前向迭代以获得 Rule
。
与标准容器不同,这里的具体子类的内存布局没有限制。相反,由子类的实现者来遵守 RuleBook
的前向迭代要求,并根据自己的数据结构满足这一要求。
我认为 RuleBook
应该包含纯虚拟 begin()
和 end()
以便它可以与 range-基于,但我遇到了一些问题。
begin() 和 end() 的签名应该是什么? BasketballRules 和 CompanyRules 应该如何实现?
当迭代器经过最后一项时,我们如何处理结束条件?
在下面的示例中,您可以假设 m_rp
和 m_rpp
各仅指向一个规则。我们想为胆量返回某种迭代器(如 Rule*
)。我们还可以假设 Foo 的所有子类都将在各种数据结构中包含 Rule
,这将取决于实现者的心血来潮。
如果我使用 Rule*
作为我的迭代器并使用 null_ptr
作为我的超越端点来实现整个事情,这是否符合 STL 标准?
我目前正在研究自定义迭代器,但我什至不确定这个问题是否适合该范例,因为每个子类都必须有效地定义迭代的核心。
代码
struct RuleBook
{
// virtual Rule* begin() = 0;
// virtual Rule* end() = 0;
};
struct CompanyRules :
public RuleBook
{
Rule m_r;
};
struct BasketballRules :
public RuleBook
{
// return the three Rules, one-at-a-time, in succession
Rule m_r;
Rule* m_rp;
Rule** m_rpp;
};
int
main( int argv, char* argc[] )
{
}
最佳答案
这很难做到正确。
What should the signatures be for begin() and end()?
没有太多选择,他们几乎必须是这样的
RuleBook::iterator begin();
RuleBook::iterator end();
(如果需要,添加 const
重载)
How should BasketballRules and CompanyRules be implemented?
小心 :)
How do we deal with the end condition when the iterator goes past the last item?
您正确设计了迭代器类型,因此它可以正常工作。您需要一个可以比较相等性并且可以递增的迭代器类型。当您有一个指向容器中最后一项的迭代器并递增它时,它必须等于尾后迭代器。
If I implement the entire thing using Rule* as my iterator and null_ptr as my beyond-the-endpoint, would this be STL compliant?
没有。如果您的迭代器类型只是 Rule*
,那么递增迭代器不会移动到下一个 Rule
,它只是指向内存中的下一个位置,甚至可能不是Rule
对象,导致未定义的行为。例如对于 BasketballRules
如果您将 Rule*
指向 m_r
并且您递增它,则您没有指向有效的 Rule
您指向被 m_rp
占用的内存的对象,即 Rule*
并且取消引用它是未定义的行为。
此外,如果您不断递增 Rule*
,您将永远无法到达最后的 nullptr
值。
我对 Yakk 的回答投了赞成票,因为它是一个看似合理的实现,但很难做到正确。有很多东西需要考虑并包含在多态接口(interface)中,例如如果您使用 ==
比较两个 RuleBook::iterator
对象,其中一个指向 CompanyRules
和一个指向 会发生什么BasketballRules
,多态迭代器的相等性如何工作?
如果将迭代器分配给 BasketballRules
对象,将迭代器分配给 CompanyRules
对象,会发生什么情况?您需要多态类型的“深拷贝”。
您需要为每个容器派生不同的迭代器实现类型,CompanyRule
容器的迭代器类型需要了解有关 CompanyRule
类型的所有信息,等等对于每个派生容器类型。这些具体的迭代器实现类型中的每一个都需要将几乎整个迭代器接口(interface)实现为虚函数。实现起来困难表明设计有问题。
一个更简单的设计是让每个派生容器类型管理一个相同类型的实际物理容器。特定于每个派生容器的代码包括只要派生对象的内容发生变化就更新列表的内容。迭代器类型然后是直接的和非多态的,例如
struct RuleBook
{
typedef std::vector<Rule*> list_type;
typedef list_type::iterator iterator;
virtual iterator begin() = 0;
virtual iterator end() = 0;
};
struct CompanyRules :
public RuleBook
{
CompanyRules() : m_list{ &m_r } { }
Rule m_r;
iterator begin() { return m_list.begin(); }
iterator end() { return m_list.end(); }
private:
list_type m_list;
};
struct BasketballRules :
public RuleBook
{
BaseketballRules() : m_list{ &m_r, m_rp, *m_rpp } { }
// return the three Rules, one-at-a-time, in succession
Rule m_r;
Rule* m_rp;
Rule** m_rpp;
iterator begin() { return m_list.begin(); }
iterator end() { return m_list.end(); }
private:
// N.B.
// must update m_list[1] any time m_rp changes
// must update m_list[2] any time the pointee of m_rpp changes (harder!)
list_type m_list;
};
关于c++ - 如何实现符合标准的迭代器/容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14089281/
我之前让 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 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!