问题标签 [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 投票
4 回答
5437 浏览

c++ - 惯用地拆分 string_view

我阅读了迭代字符串单词的最优雅方式,并享受答案的简洁性。现在我想对 string_view 做同样的事情。问题是,stringstream不能采取string_view

那么有没有办法做到这一点?如果不是,那么这样的事情不是惯用的推理是什么?

0 投票
3 回答
45883 浏览

c++ - 如何将 std::string_view 转换为 const char*?

使用带有 flag-std=c++17的 gcc-7.1 编译,以下程序会引发错误:

错误信息是

我很惊讶没有转换为,const char*因为其他库(abseil、bde)提供了类似string_view的类,这些类隐式转换为const char*.

0 投票
0 回答
201 浏览

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 pass data() to a routine that takes just a const CharT* and expects a null-terminated string.

Is there a way to properly get a null-terminated c string from a string_view?

0 投票
1 回答
5175 浏览

c++ - 如何将 std::string 拆分为 std::string_views 的范围(v3)?

我需要std::string在所有空格处拆分 a 。然而,结果范围应将其元素转换为std::string_views。我正在为范围的“元素类型”而苦苦挣扎。我猜,类型类似于c_str. 如何将“拆分”部分转换为string_views?

0 投票
0 回答
84 浏览

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 节 ¶

神螺栓

魔杖盒

0 投票
1 回答
433 浏览

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

0 投票
1 回答
327 浏览

c++ - 是否有其他容器类型的 string_view 等效项?

一个string_view是:

一个对象,它可以引用类似char对象的连续连续序列,序列的第一个元素位于零位置。

一个典型的实现只包含两个成员:一个指向常量的指针CharT和一个大小。

这允许对string. 它非常适合递归函数,否则它们将被迫使用char*s 或string::iterators 来减少字符串。

我的问题是其他容器呢?为什么只提供这个string?其他连续的容器,例如vector, map,queue等呢?

0 投票
1 回答
239 浏览

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_viewctor

换句话说,这段代码

两者都低于装配:

此外,如果我们将 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]

godbolt.org/g/wcQyY1

0 投票
2 回答
1856 浏览

c++ - 如何散列std :: string_view?

我正在尝试定义我自己的散列函数,std::unordered_map并且我想散列一个应该是键的结构中的字段。下面的代码是我所拥有的简化版本:

我得到的错误是:

根据哈希函数上的cppreferencestd::hashstd::string_view应该支持. 我觉得我错过了一些简单的东西,但我无法弄清楚。

0 投票
1 回答
305 浏览

c++ - 将整个文本文件读入内存,然后逐行处理而不分配/复制

假设我们已经将一个文本文件的内容读入了一个stringstreamvia

现在想逐行处理文件。这可以通过

但是,考虑到ss在内部缓冲区中包含文件的全部内容(并且我们可以string通过 via获取此内容ss.str()),上面的代码效率非常低。对于文件的每一行,都会进行内存分配和复制操作。

是否有可能提出一个以 aline形式提供 s的解决方案std::string_view?(随意使用其他机制来加载整个文件;我不需要通过 . 访问它stringstream。)