标签: string-view

string_view 和 basic_string<char> 之间的联系是什么?为什么 string_view 示例代码不起作用?

我已经从 Bjarne Stroustrup 的C++ 之旅中复制了代码来测试字符串视图,但我不断收到错误:

\n
error: no matching function for call to \xe2\x80\x98std::__cxx11::basic_string<char>::basic_string(std::basic_string_view<char>::size_type\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用 VS CodeWSL 2Ubuntu 20.04gcc-11

\n

在 中main.cpp,我有:

\n
#include <iostream>\n#include "strings.h"\n\nusing namespace std;\n\nint main () {\n    string king = "Harold";\n    auto s1 = cat(king, "William");\n}\n
Run Code Online (Sandbox Code Playgroud)\n

strings.h,我有以下内容。该函数按照教科书上的内容复制。我把它打出来是为了避免*出现具有不同编码的特殊字符。

\n
#pragma once\n#include <string>\n\nusing namespace std;\n\nstring cat(string_view sv1, string_view sv2) {\n    string res(sv1.length()+sv2.length());\n    char* p = &res[0];\n\n    for (char c : sv1)                  // one way\n …
Run Code Online (Sandbox Code Playgroud)

c++ string-view windows-subsystem-for-linux c++20 wsl-2

3
推荐指数
1
解决办法
625
查看次数

创建 string_view 元素数组会引发错误:无法找到字符串文字运算符 'operator""sv' with

我有以下(修改后的)代码,我想在其中创建对象数组std::string_view

\n

对应每一行编译时我看到这个错误

\n
unable to find string literal operator \xe2\x80\x98operator""sv\xe2\x80\x99 with \xe2\x80\x98const char [8]\xe2\x80\x99, \xe2\x80\x98long unsigned int\xe2\x80\x99 arguments\n         "Sensor2"sv,\n
Run Code Online (Sandbox Code Playgroud)\n

代码:

\n
#include <iostream>\n#include <array>\n#include <string_view>\n\nstruct Abc\n{\n    static constexpr std::array<std::string_view, 6> SomeValues = {\n        "Sensor1"sv,\n        "Sensor2"sv,\n        "Actuator1"sv,\n        "Actuator2"sv,\n        "Cpu1"sv,\n        "Cpu2"sv\n    };\n    \n};\n\n\nint main()\n{\n    Abc abc;\n    \n    std::cout << abc.SomeValues[3];\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

c++ string-view c++17

3
推荐指数
1
解决办法
4363
查看次数

从 std::span&lt;T&gt; 中删除第一个元素的方法是什么?

在阅读std::span的文档时,我发现没有方法可以从std::span<T>.

您能建议一种方法来解决我的问题吗?

我的问题的大局(我在另一个问题中问:How to instantiate a std::basic_string_view with custom class T,我得到 is_trivial_v<_CharT> 断言错误)是我想要一个std::basic_string_view<Token>,而这Token不是一个微不足道的问题类,所以我不能使用std::basic_string_view,有人建议我改用std::span<Token>

由于basic_string_view有一个名为删除第一个元素的方法remove_prefix,而我也需要此类函数,因为我想用作std::span<Token>解析器输入,因此令牌将被匹配,并一个接一个地消耗。

谢谢。

编辑 2023-02-04

我尝试派生一个名为Spanfrom的类std::span,并添加remove_prefix成员函数,但看起来我仍然存在构建问题:

#include <string_view>
#include <vector>
#include <span>


// derived class, add remove_prefix function to std::span
template<typename T>
class Span : public std::span<T>
{
public:
    // Inheriting constructors
    using std::span<T>::span;

    // add a public function which is similar to …
Run Code Online (Sandbox Code Playgroud)

c++ templates string-view c++20 std-span

3
推荐指数
1
解决办法
692
查看次数

如何返回std :: string的常量视图?

在使用C ++进行原型设计和玩耍时,尝试制作可识别utf8的不可变字符串的一些概念,但我遇到了以下难题:

有什么方法可以返回字符串的不变视图。就像,而不是返回子字符串,我希望能够返回引用原始字符串一部分的子字符串。

// Just some quick prototyping of ideas.
// Heavier than just a normal string.
// Construction would be heavier too because of the indices vector.
// Size would end up being O1 though.
// Indexing would also be faster.

struct ustring {
    std::string data;
    std::vector<size_t> indices;

    // How do I return a view to a string?

    std::string operator [](size_t const i) const {
        return data.substr(indices[i], indices[i + 1] - indices[i]);
    }
};
Run Code Online (Sandbox Code Playgroud)

c++ string string-view

2
推荐指数
1
解决办法
1089
查看次数

如何散列 std::string_view ?

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

struct TestStruct {
    char a[64];
    char b[64];
}

struct my_eq {
    bool operator()(const TestStruct& test_1, const TestStruct& test_2) const {
        return !strcmp(test_1.a, test_2.a) && !strcmp(test_1.b, test_2.b);
    }
};

struct my_hash {
    unsigned long operator()(const TestStruct& test) const {
        return std::hash<std::string_view>(std::string_view(test.a));
    }
};
std::unordered_map<TestStruct, int, my_hash,my_eq> map;
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

no matching function for call to ‘std::hash<std::basic_string_view<char> >::hash(std::string_view&)
Run Code Online (Sandbox Code Playgroud)

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

c++ hash string-view c++17

2
推荐指数
1
解决办法
1569
查看次数

除了std :: string_view方法之外,std :: string_view对char*有什么好处吗?

除了std :: string_view方法之外,std :: string_view对char*有什么好处吗?

是否有任何理由要重新因数char*string_view如果没有string_view将用于的方法呢?

c++ refactoring c-strings string-view c++17

2
推荐指数
1
解决办法
236
查看次数

头文件中的字符串视图文字

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

using namespace std::string_view_literals;
class T {
  static const constexpr std::string_view something1 = "Alice"sv;
  static const constexpr std::string_view something2 = "Bob"sv;
  static const constexpr std::string_view something3 = "Charlie"sv;

  ...
};
Run Code Online (Sandbox Code Playgroud)

我目前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. 别的什么?

c++ string-literals string-view c++17

2
推荐指数
1
解决办法
924
查看次数

定义std :: begin for const char*是否合法?

我有一个函数用于不区分大小写的字符串比较,它std::lexicographical_compare与自定义比较器一起使用.

但是我想能够比较strings,string_views以及const char*相互之间,提供最大的便利和效率.

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

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

namespace std {
    const char * begin(const char* str) { return str; }
    const char * end(const char* str) { return str + strlen(str); }
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以比较一切了

std::lexicographical_compare(std::begin(a), std::end(a), std::begin(b), std::end(b), icomp );
Run Code Online (Sandbox Code Playgroud)

如果没有,我怎么能解决我的问题?

c++ string string-comparison string-view

2
推荐指数
1
解决办法
300
查看次数

为什么在 C++ 标准中没有 std::basic_string 类的构造函数,其类型为 std::string_view 的参数

标准类std::basic_string没有接受类型对象作为其参数的“隐式”构造函数的原因是什么std::string_view

我希望这个程序能够编译。

#include <iostream>
#include <string>
#include <string_view>

struct A
{
    void f( const char *s ) const
    {
        std::cout << "A::f( " << s << " )\n";
    }        
};

struct B
{
    void f( const std::string &s ) const
    {
        std::cout << "B::f( " << s << " )\n";
    }        
};

template <typename... Bases>
struct C : Bases...
{
    using Bases::f...;
};

int main()
{
    C<A, B>().f( std::string_view( "Hello" ) );
    // or
    std::string_view s( …
Run Code Online (Sandbox Code Playgroud)

c++ string constructor string-view c++17

2
推荐指数
1
解决办法
292
查看次数

为什么这两个 std::string find() 函数被声明为 noexcept?

根据[string.find#1.2][string.find#1.3]

表单的每个成员函数

  • constexpr size_type F(const charT* s, size_type pos) const;

具有等效于: return F(basic_­string_­view<charT, traits>(s), pos);

表单的每个成员函数

  • constexpr size_type F(const charT* s, size_type pos, size_type n) const;

具有等效于: return F(basic_­string_­view<charT, traits>(s, n), pos);

这两个find功能都没有的声明noexcept,但所有三个编译器厂商没有按照规则,他们只是执行它noexcept

这背后的原因是什么?

c++ string noexcept string-view c++20

2
推荐指数
1
解决办法
110
查看次数