问题标签 [string-view]
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++ - 惯用地拆分 string_view
我阅读了迭代字符串单词的最优雅方式,并享受答案的简洁性。现在我想对 string_view 做同样的事情。问题是,stringstream
不能采取string_view
:
那么有没有办法做到这一点?如果不是,那么这样的事情不是惯用的推理是什么?
c++ - 如何将 std::string_view 转换为 const char*?
使用带有 flag-std=c++17
的 gcc-7.1 编译,以下程序会引发错误:
错误信息是
我很惊讶没有转换为,const char*
因为其他库(abseil、bde)提供了类似string_view
的类,这些类隐式转换为const char*
.
c++ - Converting string_view to null terminated c string
How would you convert a std::string_view
to a null-terminated c string? I've passed a string_view
into a function, and need to pass that into another function, which takes a const char*
parameter. However, looking at this documentation for string_view
, it says
data()
may return a pointer to a buffer that is not null-terminated. Therefore it is typically a mistake to passdata()
to a routine that takes just aconst CharT*
and expects a null-terminated string.
Is there a way to properly get a null-terminated c string from a string_view
?
c++ - 如何将 std::string 拆分为 std::string_views 的范围(v3)?
我需要std::string
在所有空格处拆分 a 。然而,结果范围应将其元素转换为std::string_view
s。我正在为范围的“元素类型”而苦苦挣扎。我猜,类型类似于c_str
. 如何将“拆分”部分转换为string_view
s?
c++ - 使用构造函数 string_view(const char*, size_type) 访问“对象表示”是否定义了 char 别名或未定义的行为?
让我们有这个对象
相信memcpy
也有帮助像这样的双关语类型
一切都如预期:
事实上,即使string_view
单独使用,我们也可以通过任何方式访问对象char
,这char
是允许的三个char
, unsigned char
,std::byte
别名之一。
那么我们可以像这样跳过代码的冗余复制部分吗?
输出:
构造函数 string_view(const char*, size_type) 是否通过严格别名([basic.val]/11)进行“char”别名 - N4713 第 82 页中的第 8.2.1 节 ¶
c++ - istrstream 的更好替代品?
istrstream
非常适合我的需求 - 基本上,采用固定的字符缓冲区,并给我一个简单的方法来提取行getline()
和测试eof()
我正在将我们的项目切换到 C++ 17 合规性 - 已弃用istrsteam
- 显然是因为有太多 C++ 程序员无法理解固定缓冲区内存管理(你是认真的吗?!)
无论如何,它istringstream
提供了相同的使用语义,但它现在需要在构建时复制整个固定字符缓冲区。
这是一种反模式。
我正在寻找的是一种使用 astring_view
代替 astring
的方法istringstream
,或者是一种更好的替代品,stringstream
它本身可以处理外部管理的固定缓冲区(它只需要指向它,它永远不需要担心管理该资源,只是一样strstream
)。
目前,在 VS 2017 中,这是非法的,如果我理解正确的话,在当前最先进的 C++ 中到处都是非法的(如果我错了,我相信你会纠正我!)
所以 - 想法?
注意:Peter Sommerlad 在这里为 C++ 标准机构提出了这个确切想法的建议: http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0448r1.pdf
c++ - 是否有其他容器类型的 string_view 等效项?
一个string_view
是:
一个对象,它可以引用类似
char
对象的连续连续序列,序列的第一个元素位于零位置。一个典型的实现只包含两个成员:一个指向常量的指针
CharT
和一个大小。
这允许对string
. 它非常适合递归函数,否则它们将被迫使用char*
s 或string::iterator
s 来减少字符串。
我的问题是其他容器呢?为什么只提供这个string
?其他连续的容器,例如vector
, map
,queue
等呢?
c++ - 为什么将 `const char[N]` 和 `const char*` 传递给 view::c_str() 会产生不同的二进制文件,而 string_view 会产生相同的二进制文件?
With std::string_view
,range::for_each
产生与两者的精确组装const char[N]
并const char *
传递给std::string_view
ctor
换句话说,这段代码
和
两者都低于装配:
此外,如果我们将 ac 字符串传递const char[N]
给ranges::view::c_str()
,
这会产生上面的精确装配,就像一个std::string_view
生产一样。
另一方面,如果我们传递 acconst char*
字符串ranges::view::c_str()
这次它产生了一个不同的程序集,如下所示:
哪个大会获胜?
为什么std::string_view
决定产生相同的二进制文件?
只能用和view::c_str()
产生一个更快的组装吗?const char*
const char [N]
c++ - 如何散列std :: string_view?
我正在尝试定义我自己的散列函数,std::unordered_map
并且我想散列一个应该是键的结构中的字段。下面的代码是我所拥有的简化版本:
我得到的错误是:
根据哈希函数上的cppreferencestd::hash
std::string_view
应该支持. 我觉得我错过了一些简单的东西,但我无法弄清楚。
c++ - 将整个文本文件读入内存,然后逐行处理而不分配/复制
假设我们已经将一个文本文件的内容读入了一个stringstream
via
现在想逐行处理文件。这可以通过
但是,考虑到ss
在内部缓冲区中包含文件的全部内容(并且我们可以string
通过 via获取此内容ss.str()
),上面的代码效率非常低。对于文件的每一行,都会进行内存分配和复制操作。
是否有可能提出一个以 aline
形式提供 s的解决方案std::string_view
?(随意使用其他机制来加载整个文件;我不需要通过 . 访问它stringstream
。)