问题标签 [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 回答
1572 浏览

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 的目的)

0 投票
0 回答
1628 浏览

c++ - 使用 string_view 搜索 unordered_map

我需要从给定字符串中提取一定大小的所有子字符串,并在std::unordered_map<string, int*>. 我尝试使用此答案中的建议并用作std::less<>比较器,但编译器(gcc 8.2)抱怨以下错误。我不知道在unordered_map.

代码是:

在这里使用的全部string_view目的是避免分配内存并为每个子字符串创建新字符串,那么有什么方法可以让我在unordered_map不破坏优化的情况下查询?

0 投票
1 回答
1073 浏览

c++ - 为 const char * 定义 std::begin 是否合法?

我有一个功能,用于对与自定义​​比较器一起使用的字符串进行不区分大小写的std::lexicographical_compare比较。

但是,我希望能够相互比较stringsstring_views以及const char*相互比较,以获得最大的便利和效率。

所以我在想:如果我做一个模板,std::stringbegin/ endstd::string_viewbegin/ end,......但const char*没有,甚至不是非成员函数的形式。

所以可以像这样定义自己的begin/end重载

这样我就可以将所有内容与所有内容进行比较

?

如果没有,我还能如何解决我的问题?

0 投票
1 回答
1281 浏览

string-view - gsl::string_span 和 std::string_view 有何不同?

据我所知,gsl::string_span似乎std::string_view有基本相同的使用理由。真的是这样吗?如果是这样,它们实际上是否相同?如果不是 - 它们有何不同?

相关问题:`gsl::string_span` 的目的是什么?

0 投票
0 回答
5815 浏览

c++ - 在 Ubuntu 中使用 clang 编译 c++17 代码时找不到 string_view

我收到错误消息:

当试图编译一个库(uWebSockets)时,恰好显示了它调用编译的命令:

我检查了 /usr/include 并且string_view只在里面找到experimental

即使在我更新到 libstdc++6-dev 之后,它仍然找不到来自该#include <string_view>行的 string_view 库。

是什么赋予了?

0 投票
2 回答
4210 浏览

c++ - 将 string_view 静态转换为字符串是否合法

我的问题是由stackoverflow上的这个答案引起的,https://stackoverflow.com/a/48082010/5360439。去引用,

问:你如何将 a 转换std::string_view为 a const char*

答:只需执行 astd::string(string_view_object).c_str()即可获得保证的空终止临时副本(并在行尾清理它)。

不幸的是,它构建了一个新的string. 我想知道是否可以简单地做,

现在,我的问题是:

  1. 这会构造一个新字符串吗?

  2. 是否保证返回一个以空字符结尾的字符序列?

我有一小段代码用于演示。它似乎工作正常。(查看魔杖盒结果

0 投票
5 回答
2862 浏览

c++ - 为什么 std::string_view 没有 assign() 和 clear() 方法?

这些方法的实现对我来说似乎很简单,它们可以使用std::string并且std::string_view更具可互换性。毕竟,std::string_view有构造函数使对象处于与这些方法相同的状态。可以解决这样的缺失方法:

那么,标准中没有包括这两种明显的方法的原因是什么?

更新:您评论中的一个普遍问题似乎是“有什么意义?”,所以我会给您一些背景信息。我正在解析一个大字符串,结果是子字符串的结构。该结果结构是字符串视图的自然候选者,因此我不必复制所有那些甚至重叠的字符串。结果的一部分是到字符串视图的映射,因此我可能需要在获取键时将它们构造为空,并在稍后获取值时填充它们。在解析时,我需要跟踪中间字符串,这涉及更新和重置它们。现在它们也可以被字符串视图替换,这就是我在那些缺失的函数上发生的事情。当然,我可以继续使用字符串或用普通的旧 ptr-ptr 或 ptr-size 对替换它们,但这正是std::string_view它的用途,

0 投票
0 回答
176 浏览

c++ - 在 C++17 中最有效地传递临时字符串文字?

我确实尝试过寻找其他地方,但找不到完整的答案。

所以假设我有一个创建窗口的函数或类构造函数,该函数最有可能用字符串文字调用: auto myWindow = CreateWindow("Window Title");

我想知道编写函数/构造函数声明的最佳方法是什么,因为似乎有很多选项,例如 const string ref、string_view 或 C 样式的字符串文字。我还想知道右值字符串是否可能比 ref 更好,因为它可以移动并因此在函数堆栈中构造。我希望 CreateWindow 函数成为 API 的接口或包装器,例如 Qt、SDL 或直接与操作系统一起使用,因此字符串文字可能无论如何都会传递给另一个函数,因此它可能会转换为该函数的适当类型. 这个问题对我来说主要是教育性的,因为它对这个例子影响很小

我希望我能正确地遵循堆栈溢出礼仪,如果不是,请原谅我这是我第一次大声笑!

0 投票
2 回答
422 浏览

c++ - 哈希与哈希

C++17 引入hash<string_view>。在编写我自己的自定义散列时,我想重用字符串散列的 STL 实现。

std::hash<std::string>()("Hello, world")比 慢吗std::hash<std::string_view>()("Hello, world")?是一样的吗?

我什么时候想使用std::hash<std::string>()

0 投票
2 回答
2082 浏览

c++ - 如何将 boost::string_view 转换为 std::string_view?

我正在使用一个 boost 库,它使用boost::string_view. 但是,我想std::string_view在我的代码中使用。
问:在这两者之间转换的最佳方式是什么?

目前我正在使用:

但这会创建一个不必要的字符串。