c++ - 何时在 C++ 中使用字符数组而不是字符串?

标签 c++ stdstring string-literals

我们如何区分 C++ 中的字符数组和字符串?
有什么 char 数组比 std::string 做得更好的吗?

最佳答案

How do we differentiate char arrays and string in c++?


你不知道,字符串文字是根据定义以空字符结尾的字符数组。由于数组一有机会就衰减为指针,const char*是(仍然)通常是字符串的同义词。
如果您问什么时候应该写 new char[n] ,答案是永远。如果有的话,应该是std::make_unique<char[]>(n);除非您正在编写自己的 std::string 版本,使用标准的。如果您需要缓冲区,请使用 std::vectorstd::array .const char[]有一些优点常量超过 const std::string但它们正在被新的 C++ 标准“解决”:
  • 在 C++20 之前,std::string不能用于 constexpr语境。所以,我还是更喜欢用 constexpr const char[] 声明全局字符串常量如果我所做的只是将它们传递给某个函数。正如@HolyBlackCat 在评论中提到的,C++17 std::string_view也使这个用例过时了,尤其是新的 sv文字:
    #include <string_view>
    using namespace std::literals;
    //Compile-time string_view
    constexpr auto str = "hello"sv;
    
  • const char*更普遍一些。您可以将其传递给接受 const char* 的函数, std::string , 或 std::string_view .反过来需要 std::string::c_str()如果不复制 std::string_view,这是不可能的。 .
  • 不涉及动态分配。虽然 std::string可能会使用 SSO,但不能保证。这可能与非常小的系统有关,其中堆很宝贵,程序闪存更适合并且无论如何都包含文字。
  • 与旧图书馆互动。但即便如此,std::string也是空终止的。

  • 总的来说,我的建议是使用 std::string_view你得到的每一个机会 - 对于任何非拥有的字符串,包括持有字符串文字。最重要的是,它应该取代 const char*const std::string&函数参数。如果你想拥有一个字符串,使用 std::string .

    关于c++ - 何时在 C++ 中使用字符数组而不是字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65524317/

    相关文章:

    c++ - 将 ptr 传递给返回的 std::string

    c++ - std::string 如何重载赋值运算符?

    c# - 此正则表达式中单引号的用途是什么?

    c - 取消引用 int 指针与 char 指针

    c# - 使用后缀树的唯一子串

    c++ - 编译器会在析构函数中优化 memset 吗?

    c++ - 一个奇怪的字符出现在我的字符数组的第一个

    c++ - 用 C++ 字符串替换 snprintf

    javascript - JavaScript 字符串中转义 html 中未终止的字符串文字

    c++ - protobuf 生成的文件中缺少函数