草庐IT

std-ranges

全部标签

c++ - 如何更改要反转的 std::map 的顺序?

有谁知道有什么方法可以将map顺序从“少”改为“多”吗?例如:有一个map称为test.我向其中插入一些条目:test["b"]=1;test["a"]=3;test["c"]=2;在map内部,顺序为(a,3)(b,1)(c,2).我希望它是(c,2)(b,1)(a,3).我怎样才能轻松做到这一点? 最佳答案 通过使用std::greater而不是std::less作为您的key。例如std::map>my_map;参见thereference 关于c++-如何更改要反转的std::m

C++ std::move 混淆

我对以下代码片段中发生的事情感到困惑。是move这里真的有必要吗?返回临时集的最佳且安全的方式是什么?setgetWords(){setwords;for(autoiter=wordIndex.begin();iter!=wordIndex.end();++iter){words.insert(iter->first);}returnmove(words);}我的调用代码只是执行setwords=foo.getWords() 最佳答案 首先,集合不是临时,而是本地。其次,返回它的正确方法是通过returnwords;。这不仅是您允许

c++ - Qt raw 与 std::shared_ptr

我注意到当在QT中用shared_ptr替换原始指针时,我的代码不再起作用。例如,如果不是QTreeWidgetItem*vItem(newQTreeWidgetItem(ItemTitle));我用std::shared_ptrvItem(newQTreeWidgetItem(ItemTitle));然后,要么程序崩溃,要么什么都没做(即使我使用.get()函数来获取来self代码后面共享的原始指针)。有谁知道可能是什么原因? 最佳答案 对Qt模型项使用共享指针会导致所有权冲突:QTreeWidget获取您传递给它的任何QTree

c++ - std::async 超时

有没有办法在std::async方法中实现超时,所以如果线程在指定的时间内没有完成,我希望这个调用超时并完成。我该如何实现此功能。 最佳答案 没有(标准的)方法可以进入线程并杀死它,无论如何这通常不是一个好主意。更简洁的选择是将开始时间和最长持续时间传递给函数,然后(可能随着计算的进行多次)检查当前时间减去开始时间是否太长。我会做这样的事情:#includetemplateclasstimeout{public:typedefClockclock_type;typedeftypenameclock_type::time_pointt

c++ - std::bind - 在 vi​​sual studio 中编译意外(未声明的标识符)错误

好吧,如果我正确理解std::bind,我可以使用_1之类的参数来定义一个未给定的参数?正确的?考虑以下行:std::functionfunc(std::bind(&Pred,_1,"name"));这应该行得通,对吧?这将用于std::find_if()函数,因此第一个参数应该是值类型,第二个参数应该是字符串。但是visualstudio2010对此提示并显示以下错误消息:errorC2065:'_1':undeclaredidentifier这很奇怪,我怎么能在visualstudio中说“嘿,第一个参数未绑定(bind)”。Pred是一个以value_type,conststd:

c++ - 如何优雅地将所有枚举放入 std::set

我有一个枚举,我想将它们全部放入集合中(然后使用set_intersection算法删除一些,但这是题外话)。除了我卡在第1步之外,一切都很好。:)如果我有(真实类具有更高基数的枚举)classMyClass{enumColor{red,green,blue}};我将如何初始化std::set包含所有枚举。我显然可以一个接一个地手动插入它们,做一个带强制转换的for循环,因为它们是连续的并且从0开始(我认为如果我不在枚举定义中使用=则这是必需的),但我正在寻找一种更优雅的方式。编辑:如果可能的话,我更喜欢C++03解决方案,因为当前的问题实例需要它,但如果不是,C++11也很好知道。

c++ - Ranged for loop const 引用似乎没有什么区别

如果我在C++11中有一个基于范围的for循环,for(autoconst&ticket:ticketStrip->tickets()){ticket->ClearCalled();}为什么我可以在循环内调用票证上的非const方法,例如未标记为const的ClearCalled()?voidTicket::ClearCalled(){...}ClearCalled确实修改了票证内部结构,因此不应将其标记为常量。我知道我应该使用auto&ticket不过我试过了autoconst&ticket并且编译器接受了它。票的类型是boost::shared_ptr并放入一些新代码:ticket

在 std::array 中使用默认参数调用 C++ 函数?

现在我有一个C++函数voidF(std::arrayx){//...}我希望参数“x”可以有一个默认值,我该怎么做?如果不是函数参数,我可以简单地使用std::arrayx={1,2,3};但是对于函数参数,代码voidF(std::arrayx={1,2,3}){//...}会导致编译错误。我在MSVC2012中测试,遇到错误C2143、C2059、C2447。还有g++4.6.3中的错误有什么办法让它有默认值吗?谢谢。 最佳答案 您的解决方案应符合标准,但在某些编译器中未实现。它们中的大多数可以使用语法x={{1,2,3}}初

c++ - 使用 std::list 提高简单性

有哪些更好(更清洁、更易读和/或更有效)的方法:std::listApples;std::listBasket;for(std::list::iteratorniApple(Apples.begin());niApple!=Apples.end();niApple++){for(std::list::iteratorniBasket(Basket.begin());niBasket!=Basket.end();niBasket++){if(&(*niBasket)==*niApple){Basket.erase(niBasket);break;}}//loop}//loop你会推荐什么

c++ - std::map - 如何更改键排序?

我对std::map有疑问。我用它来映射特定索引下的一些对列表:map>>List;Dijkstra算法中使用了它。主要问题是map按字母顺序对string键进行排序,如下所示:AAA,AA0,AA1,AAB,AC1=AA0->AA1->AAA->AAB->AC1但我想用不同的方式对它进行排序:AAA,AA0,AA1,AAB,AC1=AAA->AAB->AA0->AA1->AC1有什么解决办法吗?我读到过自己制作比较类,但我不知道该怎么做。还是有其他方法可以解决? 最佳答案 您必须提供自己的比较仿函数,它必须在实例化map时作为第三