问题标签 [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++ - constexpr string_view 比较
我有一个小程序可以编译,GCC
但不能在MSVC
哪个编译器上不遵循constexpr string_view
比较标准?
c++ - 在这个 std::string_view 示例中,这个尾随 s 的意义(或目的)是什么?
更新:现有答案中提供的答案和讨论足以满足这个问题。
如果您有类似的问题,建议阅读这篇关于用户定义文字的论文和std::literals::string_literals::operator""s参考
通读cppreference我遇到了这个例子。坏例子的末尾有这个尾随的“s”,我不确定它的含义。
dictionary - Boost.Container flat_map 和 std::string_view
一段时间以来,我一直使用 Boostflat_map
作为我的首选关联集合,原因解释在他们的文档介绍中引用,并且(最初)它在编译器的 std 实现之前提供了更新的功能,并且跨平台是相同的.
现在,我想开始使用string_view
来防止复制字符串,当这些字符串取自较大输入的子字符串时。 string_view
指向较大字符串中的一系列字符,而无需将它们复制到新std::string
实例中。
在找到要使用的地图时,我想起了我过去喜欢的 Boost.Container 的另一个渐进式功能是conformal keys,您可以在其中使用与存储的密钥进行正确比较的任何内容,而不是转换为实际类型的关键。
但现在我在文档中找不到任何提及。我知道std::map
现在可以做到这一点(自 C++14 起),但我宁愿将 flat_map 用于小型集合。
几年前,如果在等方面不明显,我能看到什么允许这种灵活性boost::flat_map::insert
?现在有哪些好的平面集合可以与最新的编译器一起使用?
c++ - 除了 std::string_view 方法之外,std::string_view 比 char* 有什么优势吗?
除了 std::string_view 方法之外,std::string_view 比 char* 有什么优势吗?
如果不使用任何方法,是否有任何理由重新char*
考虑?string_view
string_view
c++ - basic_string 到 basic_string_view 隐式转换...呃,为什么?
C++ 标准委员会有机会使用 string_view 使代码更安全,但他们选择添加从 basic_string 到 basic_string_view 的隐式转换。
如此有效,他们这么说
不如这个重要
请告诉我,从 basic_string 到 basic_string_view 的隐式转换有更好的理由。
最糟糕的部分是你需要 string_view 来利用 constexpr (我知道,或者 char*...)
更新:这个问题已被搁置,因为它不符合 SO 的指导方针。很公平。我认为这是需要强调的一点。我认为这是隐式转换是一种倒退。我开始看到人们(甚至是非常有经验的人)写悬空指针,因为这就像 90 年代一样。
专门使用 string_view 的最佳实践是 WRT 从所有者隐式转换为非所有者的风险?永恒的警惕不是答案。
我不得不说我很惊讶这里很少有人关心类型安全。这是“现代” C++ 的重复目标。
c++ - 为什么按值传递 string_view?为什么 Visual Studio 不能对此进行优化?
使用我的直觉,我假设新的 string_view 需要通过引用传递,因为这样更有效(只传递指针而不是完整的类)。但是,一些消息来源表明最好按值传递它,以避免“混叠”问题。
在尝试几种替代方案时,我确认了我的直觉,如果该函数只是转发 string_view (所有源编译为/Ox
) ,则通过引用传递更快
例如,这段代码
导致了这个程序集
虽然这段代码
导致了这个程序集
很明显,您可以看到在堆栈上创建了 string_view 的副本,然后将其传递给另一个方法。
但是,我想知道,为什么编译器不对此进行优化,而只是将 string_view 参数直接传递给另一个方法。毕竟,在 Windows x64 ABI 中,一个大于寄存器的类的值传递总是通过复制堆栈上的寄存器,并在正确的寄存器中传递一个指向它的指针来完成。我希望在这个示例代码中,编译器会简单地将指针转发到下一个函数,就像在传递引用的情况下一样。毕竟编译器可以看到参数的值后面没有用到,所以不用复制,直接转发地址就可以了。
我尝试将 std::move 添加到调用中,如下所示:
但这似乎没有帮助。
Visual Studio 2017 编译器无法对此进行优化是否有原因?其他编译器是否优化了这种模式?
c++ - 头文件中的字符串视图文字
我有一个有一堆常量字符串的类,形式为:
我目前using
是string_view_literals
命名空间,但这不是头文件中的好习惯,并会生成警告:
Using namespace directive in global context in header [-Wheader-hygiene]
(铛)
literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
(gcc7)
我想看看其他选择。
忽略警告
直接导入我正在使用的一个文字,而不是整个命名空间
using std::string_view_literals::operator""sv
由于这是一个 constexpr 常量,也许我应该直接调用构造函数,因为它没有运行时内存或 CPU 开销:
static const constexpr something1 = std::string_view("Alice");
还有什么?
c++ - std::string_view 和 std::string 在 std::unordered_set
假设您有一个std::unordered_set<std::string>
.
您有一个std::string_view
要在容器中搜索的对象。问题是,你不想std::string
从你的中创建一个std::string_view
,因为这std::string_view
首先违背了使用的目的。
但是,它似乎std::string_view
应该可以用作键;应该有一些方法来比较std::string_view
and std::string
,因为它们基本上都代表相同的东西。但无论如何,在 STL 中都没有。
这是一个僵局,我是否被迫编写自己的比较对象std::string_view
和std::string
与我一起使用的对象std::unordered_set
?
编辑:这个问题特定于 string_view 对象。“重复”问题不相关。正如预期的那样,我收到了一个独特问题的独特答案。
c++ - 当参数被转发而不是移动构造时,std::move 在参数列表中是否安全?
试图为std::unordered_set 中的 std::string_view 和 std::string提供解决方案,我正在玩替换std::unordered_set<std::string>
with std::unordered_map<std::string_view, std::unique_ptr<std::string>>
(该值是std::unique_ptr<std::string>
因为小字符串优化意味着string
' 的基础数据的地址将并不总是被转移的结果std::move
。
我的原始测试代码似乎有效,是(省略标题):
我用g++
7.2.0 编译,编译行g++ -O3 -std=c++17 -Wall -Wextra -Werror -flto -pedantic test_string_view.cpp -o test_string_view
没有收到任何警告,然后运行,得到以下输出:
这是我所期望的。
我主要关心的是:
已定义行为。*to_insert
依赖于在构造之后to_insert
才被清空(通过移动构造std::unique_ptr
存储在地图中)string_view
。将考虑的两个定义try_emplace
是:
和
我不确定会选择哪个,但无论哪种方式,它似乎key_type
都将作为调用的一部分构造try_emplace
,而用于制作mapped_type
(“值”) 的参数,尽管地图似乎用来value_type
指代组合的键/值pair
) 被转发,而不是立即使用,这使得代码被定义。我的解释是正确的,还是这种未定义的行为?
我担心的是,其他似乎绝对未定义的类似结构似乎仍然有效,例如:
产生预期的输出,而类似的结构如:
在运行时触发 a Segmentation fault
,尽管它们都没有发出任何类型的警告,并且两个构造似乎都同样无序(工作中的无序隐insert
式转换, segfaulting 中的无序显式转换insert
),所以我不想说“try_emplace
为我工作,所以没关系。”
请注意,虽然这个问题类似于C++11: std::move() call on arguments' list,但它并不完全是重复的(这可能是std::make_pair
这里不安全的原因,但不一定适用于try_emplace
基于转发的行为) ; 在那个问题中,接收参数的函数接收std::unique_ptr
,立即触发构造,同时try_emplace
接收转发的参数,而不是std::unique_ptr
,所以虽然std::move
“发生”(但还没有做任何事情),我认为我们是安全的,因为std::unique_ptr
“稍后”构造”。
c++ - c++17比较string_view和string时的歧义
我看到了两者std::string_view
并std::string
具有对称性operator==()
,并且std::string
它具有接受的构造函数std::string_view
和将自身转换为std::string_view
. 因此,当我们尝试使用andoperator==()
之间的比较时,它应该是模棱两可的吗?std::string_view
std::string
我想我的想法一定有问题。谁能澄清一下?
例子: