草庐IT

c++ - STL 容器速度与数组

我刚刚开始从事一个速度非常重要的科学项目(HPC)。我目前正在设计数据结构。该项目的核心是双值的3D网格,用于求解偏微分方程。由于这里的速度可能比代码的简单性更受关注,我想知道与通常的C样式数组相比,STL的性能如何。在我的例子中,因为它是一个3D网格,我正在考虑a)一个具有线性索引的一维vectorb)一个包含3个vector的vector或c)一维c型数组或d)一个三维c型数组。我查找了较早的问题,但我只发现了有关构造/破坏的问题(这在这里并不重要,因为数据结构仅在程序启动时创建一次-快速索引和计算很重要)或不同STL的比较容器。感谢帮助 最佳答案

c++ - 将 '\0' 添加到 std::string 时出现意外行为

为什么C++标准允许以下内容?#include#includeintmain(){std::strings(10,'\0');//s.length()nowis10std::cout为什么要加0算呢?它看起来像是破坏了字符串的完整性,不是吗?但我检查了标准,这是正确的行为。 最佳答案 Whydoesstandardallowsfollowing?因为设计C++字符串的人决定允许这样的事情发生。我不确定设计C++字符串的团队中是否有人在SO上……但是既然你自己说标准允许它,那就是它的方式,我怀疑它是否会改变。有时拥有一个可以包含“任何

c++ - 一种使用 STL 计算 std::string vector 中字符的方法?

虽然查找std::stringvector中的字符数量很简单,但我想知道是否有办法使用STL为您完成所有工作,而不是使用两个for循环,一个循环遍历vector,另一个循环遍历vector每个索引中的字符串。我尝试过使用其他STL函数(例如尝试以几种独特的方式使用std::for_each),但我所有的尝试都没有成功。intmain(void){intchars=0;std::vectorstr;str.push_back("Vector");str.push_back("of");str.push_back("four");str.push_back("words");for(int

C++ STL精通之旅:向量、集合与映射等容器详解

目录常用容器顺序容器向量vector构造尾接&尾删中括号运算符获取长度清空判空改变长度提前分配好空间代码演示运行结果关联容器集合set构造遍历其他代码演示运行结果​编辑映射map常用方法构造遍历其他代码演示1​编辑运行结果1代码演示2运行结果2 stringmap 代码演示3运行结果3 mp没赋初值,默认为0代码演示4运行结果4容器适配器栈stack常用方法代码演示1运行结果1vector也可以当栈来用代码演示2运行结果2队列queue常用方法代码演示运行结果优先队列priority_queue常用方法构造其他大顶堆代码演示1运行结果1 小顶堆代码演示2运行结果2修改堆顶元素代码演示3 运行结

c++ - 生成加起来为 1 的随机数字列表

这个问题在这里已经有了答案:GettingNrandomnumberswhosesumisM(9个回答)关闭8年前。是否有任何STL函数允许创建一个随机数加起来为1的vector?理想情况下,这将取决于vector的大小,这样我就可以将vector大小设置为23,并且此函数将使用0到1之间的随机数填充这23个元素,这些随机数加起来为1。

c++ - 为什么 push_back 在包含 unique_ptr 的结构上成功,除非该结构具有自定义析构函数?

当且仅当我删除Foo的自定义析构函数时,以下代码才能编译。structFoo{std::unique_ptrbar;~Foo(void){}//ThisLine};std::vectorfoos;foos.push_back(Foo());以下是我认为我对这种情况的理解:失败是因为unique_ptrs无法复制,std::vector::push_back(thing)调用thing's复制构造函数。如果我写Foo显式移动bar的自定义复制构造函数,那么一切都会好起来的。但是,禁用ThisLine将导致代码编译。我认为即使没有ThisLine也应该编译失败,因为我仍在尝试push_ba

c++ - 如何将 std::unordered_multimap<uint, T> 转储到 std::vector<T>?

我正在尝试从std::unordered_multimaplookup开始到std::vectorv到目前为止我已经尝试过了std::vectorv(lookup.begin(),lookup.end());但它显然不起作用,因为begin()的结果迭代器和end()类型为pair,那么最快的正确方法是什么?感谢您的帮助! 最佳答案 提取hashmap中std::pair的value部分,放入vector中:#include#include#includeintmain(){usingMap=std::unordered_multi

c++ - 为什么 C++ STL 容器使用 "less than"operator< 而不是 "equal equal"operator== 作为比较器?

在std::map的自定义类中实现比较运算符时,我遇到了这个问题,但看不到任何被问到的地方。除了上述问题,也有兴趣简要了解,如何operator适用于std::map.问题来源:structAddress{longm_IPv4Address;boolisTCP;booloperator 最佳答案 std::map需要能够排序。默认情况下使用std::less,对于非指针使用1。使用您对用户的要求最少的规则,它从综合“等价”当它需要它时(!(a表示a和b是等价的,即两者都不小于另一个)。这使得编写用作map的关键组件的类变得更加容易,

c++ - 自定义双向迭代器的 reverse_iterator 上的 for_each 需要 OutputIterator

我创建了一个简单的不可变双向迭代器:#include#include#include#include#includeclassmy_iterator:publicstd::iterator{intd_val;public:my_iterator():d_val(0){}my_iterator(intval):d_val(val){}my_iteratoroperator--(int){d_val--;returnmy_iterator(d_val+1);}my_iterator&operator--(){d_val--;return*this;}my_iteratoroperator+

c++ - 从字符串 vector 中获取字符串的第一个字符

如何在遍历字符串vector时获取第一个字符或如何通过索引从字符串vector中获取字符。这是我的代码:vector::iteratori=vec.begin();while(i!=vec.end()){if(i[0]==ch)cout它给出了错误:不匹配“operator==”(操作数类型为“std::basic_string”和“char”)| 最佳答案 尝试以下操作vector::iteratori=vec.begin();while(i!=vec.end()){if(i[0][0]==ch)couti[0]返回迭代器i指向的