问题标签 [stl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何从 std::map 中过滤项目?
我大致有以下代码。这可以做得更好或更有效吗?也许使用std::remove_if
?您可以在遍历地图时从地图中删除项目吗?我们可以避免使用临时地图吗?
c++ - 使用 STL 在 Vector 中定位
我试图使用 STL 查找算法(和 min_element 算法)来定位向量中最小值的位置,但不是返回位置,它只是给了我值。例如,如果是最小值,则位置将返回为 8 等。我在这里做错了什么?
c++ - 比较函子类型与运算符<
在Google C++ Style Guide中,运算符重载部分建议不要重载任何运算符(“除非在罕见的特殊情况下”)。具体来说,它建议:
特别是,不要重载
operator==
或operator<
只是为了让你的类可以用作 STL 容器中的键;相反,您应该在声明容器时创建相等和比较函子类型。
我对这样的仿函数看起来有点模糊,但我的主要问题是,你为什么要为此编写自己的仿函数?定义operator<
和使用标准std::less<T>
函数不会更简单吗?使用其中一个有什么优势吗?
c++ - if(str1==str2) 与 if(str1.length()==str2.length() && str1==str2)
我在另一个人的代码中看到了第二个,我想这种长度比较是为了提高代码效率。它用于具有特定字典的脚本语言的解析器:单词长度为 4 到 24 个字母,平均为 7-8 个小写字母,字母表包括 26 个拉丁字母加上“@”、“$”和“_”。
长度比较用于转义 == 运算符处理 STL 字符串,这显然比简单的整数比较需要更多时间。但同时给定字典中的首字母分布比单词大小的分布更宽,因此比较字符串的两个首字母通常比字符串的大小更经常不同。这使得长度比较变得不必要。
我已经进行了一些测试,这就是我发现的:在测试两个随机字符串比较数百万次时,第二种方法要快得多,所以长度比较似乎很有帮助。但是在一个工作项目中,它在调试模式下运行得更慢,而在发布模式下运行速度不够快。
所以,我的问题是:为什么长度比较可以加快比较速度,为什么可以减慢速度?
UPD:我也不喜欢第二种方式,但我想这样做是有原因的,我想知道这是什么原因。
UPD2:说真的,问题不在于如何做到最好。在这种情况下,我什至不再使用 STL 字符串。难怪长度比较是不必要的和错误的等等。奇怪的是 - 它确实倾向于在某个测试中稍微好一点。这怎么可能?
c++ - 我是否需要在多线程环境中保护对 STL 容器的读取访问?
我有一个 std::list<> 容器和这些线程:
一个无限期添加元素的作家线程。
一个读取器/写入器线程,在可用时读取和删除元素。
访问容器大小的几个读取器线程(通过使用 size() 方法)
有一个普通的互斥锁可以保护前两个线程对列表的访问。我的问题是,大小读取器线程是否也需要获取此互斥锁?我应该使用读/写互斥锁吗?
我在使用 Visual C++ 6 的 Windows 环境中。
更新:看起来答案还不清楚。总结主要疑问:考虑到我不需要确切的值(即我可以假设一个+/- 1 个变化)?竞争条件如何使我的 size() 调用返回无效值(即与好的值完全无关的值)?
回答: 通常,必须保护读者线程以避免竞争条件。尽管如此,在我看来,上述更新中提到的一些问题还没有得到解答。
提前致谢!
谢谢大家的答案!
c++ - 您如何通过 STL 列表向后迭代?
我正在编写一些 Windows 和 Mac 之间的跨平台代码。
如果 list::end() “返回一个迭代器,该迭代器指向列表中最后一个元素之后的位置”并且可以在向前遍历列表时检查,那么向后遍历的最佳方法是什么?
此代码适用于 Mac,但不适用于 Windows(不能递减超过第一个元素):
这适用于 Windows:
是否有另一种可以在 for 循环中实现的向后遍历方法?
c++ - 循环内的迭代器初始化是否被认为是不好的风格,为什么?
通常你会发现这样的 STL 代码:
但我们实际上有这样的建议:
如果您担心范围,请添加括号:
这应该可以提高速度和效率,尤其是在您对控制台进行编程时,因为在循环的每次迭代中都不会调用 .end() 函数。我只是认为性能改进是理所当然的,这听起来很合理,但我不知道有多少,这当然取决于容器的类型和实际使用的 STL 实现。但是在使用这种风格几个月后,我实际上比第一种更喜欢它。
原因是可读性:for 行整洁。在实际生产代码中使用限定符和成员变量,如果您使用第一个示例中的样式,很容易使行很长。这就是为什么我在这个例子中故意让它有一个水平滚动条,只是为了让你明白我在说什么。;)
另一方面,您突然将 Iter 变量引入 for 循环的外部范围。但是,至少在我工作的环境中,即使在第一个示例中,Iter 也可以在外部范围内访问。
你对此有什么看法?除了可能限制Iter的范围之外,第一种风格是否有任何专业人士?
c++ - 从 Visual Studio 6 升级有哪些令人信服的论据?
我有一个客户仍在使用 Visual Studio 6 来构建生产系统。他们编写使用 STL 并在多处理器机器上运行的多线程系统。
有时,当他们更改其中一台服务器机器的规格或增加其负载时,他们会变得“奇怪”,难以重现错误......
我知道 Visual Studio 6 开发存在几个问题,我想说服他们迁移到 Visual Stuio 2005 或 2008(他们拥有 Visual Studio 2005 并将其用于某些项目)。
此问题的目的是汇总已知问题或升级原因的列表,以及讨论或报告这些问题的链接。拥有这些问题如何折磨你的真实“恐怖故事”也会很有用。
c++ - tr1::reference_wrapper 有什么用?
最近,我一直在阅读 Scott Meyers 出色的Effective C++书籍。在最后一个技巧中,他介绍了 TR1 的一些功能——我通过 Boost 了解了其中的许多功能。
但是,有一个我绝对不认识:tr1::reference_wrapper。
我将如何以及何时使用 tr1::reference_wrapper?