Questions tagged «c++-standard-library»

在C ++编程语言中,C ++标准库是类和函数的集合,这些类和函数可以用也可以不用核心语言编写,并且是C ++的一部分

25
如何将std :: string转换为小写?
我想将A转换std::string为小写。我知道该函数tolower(),但是在过去,我对该函数存在问题,无论如何它都不是理想的选择,因为与a std::string一起使用需要对每个字符进行迭代。 有没有一种替代方法可以100%地起作用?


5
“ STL”和“ C ++标准库”有什么区别?
有人引起了我的注意,这篇文章声称(我的意思是) STL术语被误用来指代整个C ++标准库,而不是指从SGI STL中获得的部分。 (...)它指的是“ STL”,尽管实际上仍然很少有人使用STL(这是SGI设计的)。 C ++标准库的某些部分是基于STL的,因此很多人(包括数位作者和臭名昭著的cplusplus.com)仍然将这些部分称为“ STL”。但是,这是不准确的。实际上,C ++标准从不提及“ STL”,并且两者之间存在内容差异。 (...)“ STL”很少用于指代基于SGI STL的stdlib的位。人们认为这是整个标准库。它被放在简历上。这是一种误导。 我几乎不了解C ++的历史,因此我无法判断本文的正确性。我应该避免使用术语STL吗?还是这是一个孤立的意见?


8
迭代时从std :: set中删除元素
我需要遍历一组并删除符合预定义条件的元素。 这是我编写的测试代码: #include <set> #include <algorithm> void printElement(int value) { std::cout << value << " "; } int main() { int initNum[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; std::set<int> numbers(initNum, initNum + 10); // print '0 1 2 3 4 5 6 7 …


2
libc ++中短字符串优化的机制是什么?
该答案很好地概述了短字符串优化(SSO)。但是,我想更详细地了解它在实践中如何工作,特别是在libc ++实现中: 要符合SSO要求,字符串必须多短?这取决于目标体系结构吗? 访问字符串数据时,实现如何区分短字符串和长字符串?它是否像m_size <= 16其他成员变量中的一部分一样简单?(我想它的m_size一部分或一部分也可以用来存储字符串数据)。 我专门针对libc ++提出了这个问题,因为我知道它使用SSO,甚至在libc ++主页上也提到了这一点。 查看来源后,有一些观察结果: libc ++可以为字符串类使用两个略有不同的内存布局进行编译,这由_LIBCPP_ALTERNATE_STRING_LAYOUT标志控制。两种布局还区分了小端和大端机器,这使我们总共有4种不同的变体。在接下来的内容中,我将采用“普通”布局和小字节序。 进一步假设这size_type是4个字节,也value_type就是1个字节,这就是字符串的前4个字节在内存中的样子: // short string: (s)ize and 3 bytes of char (d)ata sssssss0;dddddddd;dddddddd;dddddddd ^- is_long = 0 // long string: (c)apacity ccccccc1;cccccccc;cccccccc;cccccccc ^- is_long = 1 由于短字符串的大小在高7位中,因此在访问它时需要对其进行移位: size_type __get_short_size() const { return __r_.first().__s.__size_ >> 1; } 同样,长字串容量的getter和setter用来__long_mask解决该is_long位。 我仍在寻找第一个问题的答案,即__min_cap对于不同的体系结构,短字符串的容量将获得什么价值? 其他标准库实现 …

2
如何使用C ++ 17获得以字节为单位的文件大小
我应该知道,特定操作系统是否存在陷阱? 有很多重复(1,2,3,4,5这个问题),但他们在几十年前进行了解答。在许多这些问题中,投票率很高的答案今天是错误的。 .sx上其他(旧质量检查)的方法 stat.h(wrapper sprintstatf),使用syscall tellg(),根据定义返回一个位置,但不一定返回bytes。返回类型不是int。

1
为什么libc ++的vector <bool> :: const_reference不是bool?
第23.3.7节vector&lt;bool&gt;[vector.bool] 类的第1段规定: template &lt;class Allocator&gt; class vector&lt;bool, Allocator&gt; { public: // types: typedef bool const_reference; ... 但是,使用libc ++时,该程序无法编译: #include &lt;vector&gt; #include &lt;type_traits&gt; int main() { static_assert(std::is_same&lt;std::vector&lt;bool&gt;::const_reference, bool&gt;{}, "?"); } 此外,我注意到C ++标准在此规范中一直到C ++ 98都是一致的。而且我还要指出,自从首次引入libc ++以来,libc ++一直未遵循此规范。 这种不符合的动机是什么?


4
现代C ++的实验功能对长期项目是否可靠?
我有一个当前使用C ++ 11/14的项目,但是它需要类似的东西std::filesystem,它仅在C ++ 17中可用,因此我目前没有机会使用它。但是,我看到它在我当前的编译器中可用std::experimental::filesystem。使用实验性功能是否是一个好主意,假设我将来可以添加以下内容: #ifdef CXX17 //if this is C++17 std::filesystem::something ...; #else std::experimental::filesystem::something ...; #endif 我担心的是: 1.是否保证所有兼容的编译器都具有相同的实验功能? 2.实验功能是否容易发生重大变化而使其不可靠? 也许还有更多事情想知道。为什么我应该或不应该使用它们?我为一个新项目感到困惑,不知道该怎么决定。

9
为什么C ++标准库中没有transform_if?
想要进行有条件的复制时出现一个用例(1.可使用copy_if),但要从值的容器到指向这些值的指针的容器(2.可以使用transform)。 使用可用的工具,我无法通过不到两个步骤来做到这一点: #include &lt;vector&gt; #include &lt;algorithm&gt; using namespace std; struct ha { int i; explicit ha(int a) : i(a) {} }; int main() { vector&lt;ha&gt; v{ ha{1}, ha{7}, ha{1} }; // initial vector // GOAL : make a vector of pointers to elements with i &lt; 2 vector&lt;ha*&gt; ph; // …

10
std :: queue迭代
我需要遍历std::queue。www.cplusplus.com说: 默认情况下,如果未为特定队列类指定容器类,则使用标准容器类模板双端队列。 那么我可以以某种方式到达队列的底层双端队列并对其进行迭代吗?



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.