我想将a转换std::string
为小写.我知道这个函数tolower()
,但是在过去我遇到了这个函数的问题,并且它很难理想,因为使用a std::string
会需要迭代每个字符.
有没有一种方法可以100%的时间运作?
有人把这篇文章给我的注意,声称(我意译)的STL长期被误指整个C++标准库,而不是从SGI STL中采取的部分.
(...)它指的是"STL",尽管很少有人仍然使用STL(在SGI设计).
C++标准库的一部分基于STL的一部分,正是这些部分,许多人(包括几位作者和臭名昭着的错误记录的cplusplus.com)仍然称为"STL".但是,这是不准确的; 事实上,C++标准从未提及"STL",两者之间存在内容差异.
(...)"STL"很少用于指代恰好基于SGI STL的stdlib的位.人们认为这是整个标准库.它被放在简历上.这是误导.
我几乎不了解C++的历史,所以我不能判断文章的正确性.我应该避免使用术语STL吗?或者这是一个孤立的意见?
我很喜欢矢量.他们很快,很快.但我知道这个叫做valarray的东西存在.为什么我会使用valarray而不是矢量?我知道valarray有一些语法糖,但除此之外,它们什么时候有用?
我需要浏览一个集合并删除符合预定义条件的元素.
这是我写的测试代码:
#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 8 9'
std::for_each(numbers.begin(), numbers.end(), printElement);
std::set<int>::iterator it = numbers.begin();
// iterate through the set and erase all even numbers
for (; it != numbers.end(); ++it) {
int n = *it; …
Run Code Online (Sandbox Code Playgroud) 这个答案给出了短字符串优化(SSO)的一个很好的高级概述.但是,我想更详细地了解它在实践中是如何工作的,特别是在libc ++实现中:
为了符合SSO资格,字符串有多短?这取决于目标架构吗?
在访问字符串数据时,实现如何区分短字符串和长字符串?它m_size <= 16
是一个简单的,还是一个标志,是其他成员变量的一部分?(我想这m_size
或其中的一部分也可能用于存储字符串数据).
我专门针对libc ++问了这个问题,因为我知道它使用SSO,甚至在libc ++主页上也提到过.
以下是查看来源后的一些观察结果:
libc ++可以使用两个稍微不同的字符串类内存布局进行编译,这由_LIBCPP_ALTERNATE_STRING_LAYOUT
标志控制.这两种布局还区分了little-endian和big-endian机器,这使我们总共有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
Run Code Online (Sandbox Code Playgroud)
由于短字符串的大小在高7位,因此在访问它时需要移位:
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
Run Code Online (Sandbox Code Playgroud)
类似地,长字符串容量的getter和setter用于__long_mask
解决这个问题is_long
.
我仍在寻找我的第一个问题的答案,即__min_cap
短字符串的容量对不同的架构有什么价值?
其他标准库实现
这个答案很好地概述了std::string
其他标准库实现中的内存布局.
第23.3.7节vector<bool>
[vector.bool]第1段规定:
template <class Allocator> class vector<bool, Allocator> {
public:
// types:
typedef bool const_reference;
...
Run Code Online (Sandbox Code Playgroud)
但是,当使用libc ++时,此程序无法编译:
#include <vector>
#include <type_traits>
int
main()
{
static_assert(std::is_same<std::vector<bool>::const_reference, bool>{}, "?");
}
Run Code Online (Sandbox Code Playgroud)
此外,我注意到C++标准在本规范中一直与C++ 98一致.我还注意到自从第一次引入libc ++以来,libc ++一直没有遵循这个规范.
这种不合格的动机是什么?
我有一个目前使用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
Run Code Online (Sandbox Code Playgroud)
我担心的是:
1.是否保证所有兼容编译器具有相同的实验功能?
2.实验性特征是否容易发生重大变化,使其不可靠?
也许还有更多值得关注的事情.我为什么要或不应该使用它们?我对一个新项目感到困惑,不知道该决定什么.
C++标准库是否定义了此函数,还是必须使用Boost?
我搜索网络除了Boost之外找不到任何东西,但我想我最好问一下这里.