问题标签 [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.

0 投票
1 回答
4124 浏览

c++ - constexpr string_view 比较

我有一个小程序可以编译,GCC但不能在MSVC哪个编译器上不遵循constexpr string_view比较标准?

0 投票
0 回答
63 浏览

c++ - 在这个 std::string_view 示例中,这个尾随 s 的意义(或目的)是什么?

更新:现有答案中提供的答案和讨论足以满足这个问题。

如果您有类似的问题,建议阅读这篇关于用户定义文字的论文和std::literals::string_literals::operator""s参考


通读cppreference我遇到了这个例子。例子的末尾有这个尾随的“s”,我不确定它的含义。

参考

0 投票
2 回答
714 浏览

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现在有哪些好的平面集合可以与最新的编译器一起使用?

0 投票
1 回答
456 浏览

c++ - 除了 std::string_view 方法之外,std::string_view 比 char* 有什么优势吗?

除了 std::string_view 方法之外,std::string_view 比 char* 有什么优势吗?

如果不使用任何方法,是否有任何理由重新char*考虑?string_viewstring_view

0 投票
1 回答
392 浏览

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++ 的重复目标。

0 投票
1 回答
1645 浏览

c++ - 为什么按值传递 string_view?为什么 Visual Studio 不能对此进行优化?

使用我的直觉,我假设新的 string_view 需要通过引用传递,因为这样更有效(只传递指针而不是完整的类)。但是,一些消息来源表明最好按值传递它,以避免“混叠”问题。

在尝试几种替代方案时,我确认了我的直觉,如果该函数只是转发 string_view (所有源编译为/Ox) ,则通过引用传递更快

例如,这段代码

导致了这个程序集

虽然这段代码

导致了这个程序集

很明显,您可以看到在堆栈上创建了 string_view 的副本,然后将其传递给另一个方法。

但是,我想知道,为什么编译器不对此进行优化,而只是将 string_view 参数直接传递给另一个方法。毕竟,在 Windows x64 ABI 中,一个大于寄存器的类的值传递总是通过复制堆栈上的寄存器,并在正确的寄存器中传递一个指向它的指针来完成。我希望在这个示例代码中,编译器会简单地将指针转发到下一个函数,就像在传递引用的情况下一样。毕竟编译器可以看到参数的值后面没有用到,所以不用复制,直接转发地址就可以了。

我尝试将 std::move 添加到调用中,如下所示:

但这似乎没有帮助。

Visual Studio 2017 编译器无法对此进行优化是否有原因?其他编译器是否优化了这种模式?

0 投票
1 回答
3410 浏览

c++ - 头文件中的字符串视图文字

我有一个有一堆常量字符串的类,形式为:

我目前usingstring_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)

我想看看其他选择。

  1. 忽略警告

  2. 直接导入我正在使用的一个文字,而不是整个命名空间

    using std::string_view_literals::operator""sv

  3. 由于这是一个 constexpr 常量,也许我应该直接调用构造函数,因为它没有运行时内存或 CPU 开销:

    static const constexpr something1 = std::string_view("Alice");

  4. 还有什么?

0 投票
1 回答
4497 浏览

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_viewand std::string,因为它们基本上都代表相同的东西。但无论如何,在 STL 中都没有。

这是一个僵局,我是否被迫编写自己的比较对象std::string_viewstd::string与我一起使用的对象std::unordered_set

编辑:这个问题特定于 string_view 对象。“重复”问题不相关。正如预期的那样,我收到了一个独特问题的独特答案。

0 投票
1 回答
621 浏览

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“稍后”构造”。

0 投票
2 回答
7130 浏览

c++ - c++17比较string_view和string时的歧义

我看到了两者std::string_viewstd::string具有对称性operator==(),并且std::string它具有接受的构造函数std::string_view和将自身转换为std::string_view. 因此,当我们尝试使用andoperator==()之间的比较时,它应该是模棱两可的吗?std::string_viewstd::string

我想我的想法一定有问题。谁能澄清一下?

例子: