我有一些处理各种 std::list 对象的代码,我目前正在使用一种非常低效的方法在它们之间传输内容(我正在遍历一个列表的任意部分,并一个一个地移动元素进入第二个列表)。我在知道 std::list::splice 函数之前写了这段代码,现在我打算用它替换我的代码,例如:
list<string> list1, list2;
list1.push_back("a");
list1.push_back("b");
list1.push_back("c"); // list1: "a", "b", "c"
list<string>::iterator iterator1 = list1.begin();
iterator1++: // points to "b"
list2.push_back("x");
list2.push_back("y");
list2.push_back("z"); // list2: "x", "y", "z"
list<string>::iterator iterator2 = list2.begin();
iterator2++; // points to "y"
list1.splice(iterator1, list2, iterator2, list2.end());
// list1: "a", "y", "z", "b", "c"
// list2: "x"
我对拼接函数的复杂性有疑问。根据这个来源:
http://www.cplusplus.com/reference/stl/list/splice/
它应该在被拼接的第一个和最后一个元素之间的范围内具有线性复杂性(在我的示例中为 iterator2 和 list2.end()),并且消息来源表明这是因为迭代器提前。我可以忍受这一点,但我一直希望不断复杂。
我的假设(在我找到这个来源之前)是拼接函数做了这样的事情:
从而将两个列表恢复为完整的链。
同样的原则将适用于任意大小的列表。我不确定在哪里需要 splice 函数来推进任何迭代器,因为我为它提供了完成工作所需的所有迭代器。
所以我的问题是,C++ 规范如何处理这个问题?它是仅在接头的起点和终点断开并重新形成链接,还是一个接一个地通过每个链接?如果是后者,是否有任何其他列表容器(例如来自 QT)提供前者?我的代码位于模拟程序的内部循环中,因此赋予它恒定而不是线性复杂度将非常有值(value)。
最佳答案
这是 C++11 标准化过程中一个非常有争议的话题。问题是所有标准容器,包括列表,也有一个恒定时间的 size 操作。
在 C++11 之前,许多实现使 size 线性时间和不同列表之间的 splice 恒定时间。 C++11 现在要求 size 为常数,splice 为线性。
问题是,如果拼接范围的长度不是一个一个计算,那么容器就无法跟踪删除和添加了多少元素,以及下一次调用 size 需要在 O(N) 时间内恢复此信息 - 使用整个序列中较大的 N,而不仅仅是拼接部分。
非标准的 list 容器可以提供所需的操作,因为只要您不需要 O(1) size,您的论点就是正确的。
至于其他库...我不知道有一个,但 Boost 应该有一个。 (我查了一下,没有,所以有人开始吧!)既然你清楚地知道如何编写你自己的,这样做可能比与 Qt 这么大的库竞争更省力。
如果您不需要线程安全,您可以在 std::list 周围实现一个包装器,其中每个容器只拥有一个单例列表的子范围。这将消除复制标准接口(interface)的大部分编程工作。
关于c++ - std::list::splice 和其他列表容器的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10134836/
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25
我正在开发西洋跳棋实现,其中有许多易于测试的方法,但我不确定如何测试我的主要#play_game方法。我的大多数方法都可以很容易地确定输入和输出,因此也很容易测试,但这种方法是多方面的,实际上并没有容易辨别的输出。这是代码:defplay_gameputs@gui.introwhile(game_over?==false)message=nil@gui.render_board(@board)@gui.move_requestplayer_input=getscoordinates=UserInput.translate_move_request_to_coordinates(play