草庐IT

c++ - 模板函数中需要什么类型的迭代器?

coder 2024-02-20 原文

我正在制作自己的基于计数排序的 sort() 算法。它对范围有限的正数进行排序。到目前为止,它适用于 std::string 和 std::vector。

原型(prototype)如下:

template<class ForwardIterator, int maxNumbers>
void sortIntegers(ForwardIterator start, ForwardIterator end)

我的算法使用*iter =++itercopy = iter。来自 http://www.cplusplus.com/reference/iterator/我确定我需要一个 ForwardIterator 或更好的。

这是确定我的算法所需的最通用迭代器类型的正确方法吗?我不确定我是否应该尝试变得通用。我只是猜我应该。这样我就可以支持最多数量的容器。然后,当我查看 STL sort() 时,我发现它使用随机访问迭代器 (http://www.cplusplus.com/reference/algorithm/sort/)。对我来说,这意味着它受限于它支持的容器。例如,它会在列表上工作吗?

我认为 STL 做得对。那么为什么我在我的函数中只需要 ForwardIterator 是错误的呢?也许当我测试更多容器类型时,我会意识到我需要更多限制?

还有一个好处,我知道将类类型命名为 ForwardIterator 只是一个文档要求。 STL 是否做了更多工作以确保传递给 sort() 的是随机访问迭代器?因此,如果我将列表迭代器传递给 sort(),我假设我得到了错误。这些错误是如何产生的?

最佳答案

Is that the correct way to determine the most generic type of iterator my algorithm requires?

嗯,是的。查看概念并确定您的算法需要哪个迭代器概念是正确的方法。

To me that means it is limited on what containers it supports. For instance, would it work on list?

不,它不适用于 std::list,因为 std::list 仅支持 BidirectionalIterator 概念,而 RandomAccessIterator 源自该概念。是的,因此它在某些容器上受到限制。

So why am I wrong to only require ForwardIterator in my function?

这没有错,但你是有限的,即你不能使用 --it 例如,但如果没问题,那么它就没有错。我认为 C++ 只是想为实现提供尽可能多的自由。

Does STL do more to ensure what is passed in to sort() is a Random Access Iterator?

不,没有保护。唯一的问题是,如果你调用它时没有使用 RandomAccessIterator,你将得到一个(或多个)错误,因为你的迭代器不支持 std::sort 要求的操作(比如 [], --, ...).

Concepts 有一个 TS,它可以做到这一点,对模板参数强制执行编译时要求,并在您使用错误类型时产生有用的错误消息。但这可能会出现在 C++20 中。

您也可以按照@JustinTime 的建议进行特征检查以检查迭代器的标签,但遗憾的是标准不要求这样做,所以实际上没有或很少有实现这样做(我不知道,所以我可以'不确定这一点)。

关于c++ - 模板函数中需要什么类型的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40617700/

有关c++ - 模板函数中需要什么类型的迭代器?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  3. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  7. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  8. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  9. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  10. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

随机推荐