问题标签 [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++ - 比较 std::string_view 和子字符串 string_view
假设我们有一个 string_view 和另一个 string_view,它是第一个 string_view 的子集:
所有比较都适用于 gcc (9 HEAD) 和 clang (8 HEAD) 下的 Linux。在 Windows Visual c++ (15.7.6) 下,不允许比较两个迭代器(在调试模式下,您会收到一个断言错误cannot compare incompatible string_view iterators for equality
)。
接下来是指针比较:
因此,当您尝试在 Visual C++ 中修复它时,您想要比较地址it == &*s.end()
,但这会失败,因为end()
迭代器不应该被取消引用(如果我没记错的话,UB)所以你得到cannot dereference end string_view iterator
.
boost::string_view 支持it == s.end()
比较,所以我很惊讶 std 实现更多限制(因此对跨平台工作的用户友好性要低得多)
我知道两个不同容器的迭代器比较是 UB,但 string_view 不是容器(它不拥有底层内存)它是某种形式的智能指针,所以我希望语言允许我比较这样的迭代器,相信我视图指向同一容器的不同(或相同)子集。
所以我的问题是我怎样才能使这样的事情只与 string_view 一起工作?
(意思是不需要创建一个包含两个迭代器的自定义范围类,因为这会破坏首先使用 std::string_view 的目的)
c++ - 使用 string_view 搜索 unordered_map
我需要从给定字符串中提取一定大小的所有子字符串,并在std::unordered_map<string, int*>
. 我尝试使用此答案中的建议并用作std::less<>
比较器,但编译器(gcc 8.2)抱怨以下错误。我不知道在unordered_map
.
代码是:
在这里使用的全部string_view
目的是避免分配内存并为每个子字符串创建新字符串,那么有什么方法可以让我在unordered_map
不破坏优化的情况下查询?
c++ - 为 const char * 定义 std::begin 是否合法?
我有一个功能,用于对与自定义比较器一起使用的字符串进行不区分大小写的std::lexicographical_compare
比较。
但是,我希望能够相互比较strings
,string_views
以及const char*
相互比较,以获得最大的便利和效率。
所以我在想:如果我做一个模板,std::string
有begin
/ end
,std::string_view
有begin
/ end
,......但const char*
没有,甚至不是非成员函数的形式。
所以可以像这样定义自己的begin
/end
重载
这样我就可以将所有内容与所有内容进行比较
?
如果没有,我还能如何解决我的问题?
string-view - gsl::string_span 和 std::string_view 有何不同?
据我所知,gsl::string_span
似乎std::string_view
有基本相同的使用理由。真的是这样吗?如果是这样,它们实际上是否相同?如果不是 - 它们有何不同?
c++ - 在 Ubuntu 中使用 clang 编译 c++17 代码时找不到 string_view
我收到错误消息:
当试图编译一个库(uWebSockets)时,恰好显示了它调用编译的命令:
我检查了 /usr/include 并且string_view
只在里面找到experimental
即使在我更新到 libstdc++6-dev 之后,它仍然找不到来自该#include <string_view>
行的 string_view 库。
是什么赋予了?
c++ - 将 string_view 静态转换为字符串是否合法
我的问题是由stackoverflow上的这个答案引起的,https://stackoverflow.com/a/48082010/5360439。去引用,
问:你如何将 a 转换
std::string_view
为 aconst char*
?答:只需执行 a
std::string(string_view_object).c_str()
即可获得保证的空终止临时副本(并在行尾清理它)。
不幸的是,它构建了一个新的string
. 我想知道是否可以简单地做,
现在,我的问题是:
这会构造一个新字符串吗?
是否保证返回一个以空字符结尾的字符序列?
我有一小段代码用于演示。它似乎工作正常。(查看魔杖盒结果)
c++ - 为什么 std::string_view 没有 assign() 和 clear() 方法?
这些方法的实现对我来说似乎很简单,它们可以使用std::string
并且std::string_view
更具可互换性。毕竟,std::string_view
有构造函数使对象处于与这些方法相同的状态。可以解决这样的缺失方法:
那么,标准中没有包括这两种明显的方法的原因是什么?
更新:您评论中的一个普遍问题似乎是“有什么意义?”,所以我会给您一些背景信息。我正在解析一个大字符串,结果是子字符串的结构。该结果结构是字符串视图的自然候选者,因此我不必复制所有那些甚至重叠的字符串。结果的一部分是到字符串视图的映射,因此我可能需要在获取键时将它们构造为空,并在稍后获取值时填充它们。在解析时,我需要跟踪中间字符串,这涉及更新和重置它们。现在它们也可以被字符串视图替换,这就是我在那些缺失的函数上发生的事情。当然,我可以继续使用字符串或用普通的旧 ptr-ptr 或 ptr-size 对替换它们,但这正是std::string_view
它的用途,
c++ - 在 C++17 中最有效地传递临时字符串文字?
我确实尝试过寻找其他地方,但找不到完整的答案。
所以假设我有一个创建窗口的函数或类构造函数,该函数最有可能用字符串文字调用:
auto myWindow = CreateWindow("Window Title");
我想知道编写函数/构造函数声明的最佳方法是什么,因为似乎有很多选项,例如 const string ref、string_view 或 C 样式的字符串文字。我还想知道右值字符串是否可能比 ref 更好,因为它可以移动并因此在函数堆栈中构造。我希望 CreateWindow 函数成为 API 的接口或包装器,例如 Qt、SDL 或直接与操作系统一起使用,因此字符串文字可能无论如何都会传递给另一个函数,因此它可能会转换为该函数的适当类型. 这个问题对我来说主要是教育性的,因为它对这个例子影响很小
我希望我能正确地遵循堆栈溢出礼仪,如果不是,请原谅我这是我第一次大声笑!
c++ - 哈希与哈希
C++17 引入hash<string_view>
。在编写我自己的自定义散列时,我想重用字符串散列的 STL 实现。
std::hash<std::string>()("Hello, world")
比 慢吗std::hash<std::string_view>()("Hello, world")
?是一样的吗?
我什么时候想使用std::hash<std::string>()
?
c++ - 如何将 boost::string_view 转换为 std::string_view?
我正在使用一个 boost 库,它使用boost::string_view
. 但是,我想std::string_view
在我的代码中使用。
问:在这两者之间转换的最佳方式是什么?
目前我正在使用:
但这会创建一个不必要的字符串。