【问题标题】:Why does string::begin exist?为什么 string::begin 存在?
【发布时间】:2020-07-31 15:10:08
【问题描述】:

如果我理解正确,string::begin 返回指向字符串中第一个元素的指针。如果是这样,我们为什么不直接使用&str 来获取指针。

在某些情况下使用begin 更好,还是我误解了它的功能?

【问题讨论】:

  • std::string::begin 返回一个指向第一个元素的迭代器——不一定是指针,但通常它是通过一个指向第一个元素的简单指针来实现的。话虽如此,重要的是要注意给定std::string str&str 不是指向第一个字符的指针(也不是指向一个字符的迭代器)。它是一个指向字符串的指针。指向字符串的指针不是指向第一个字符的指针。
  • 我太累了,无法做出正确的答案,但一个好的答案可能还会提到 beginend 对在调用标准库方法时的有用性,因为 OP 似乎不够新知道。
  • OP 可能意味着&str[0]...

标签: c++ stl iterator stdstring


【解决方案1】:

如果我理解正确,string::begin 返回指向字符串中第一个元素的指针。

不,它返回一个 iterator 到字符串中的第一个元素。它有助于使 std::string 与设计用于标准容器的语言结构(想想模板)兼容。

我们为什么不直接使用&str 来获取指针。

一方面,那不是字符串第一个元素的地址吗?假设strstd::string 类型的变量,这将是一个对象的地址,除其他外,(通常)包含指向字符串第一个元素的指针。 (如果您的意思是c_str() 成员函数,那么可以这样做,但这不是一个特别清晰易读的语法。)

【讨论】:

  • 旁注:当使用小字符串优化 (SSO) 时,std::string 不保存指向字符串第一个元素的指针。所有字符都原地存储。 c_str() 也可能导致复制。我认为.data() 可能是您所指的。
  • @Kostas 确实如此。我承认了这一点,但与可能引起混淆的情况相比,我认为解释 SSO 不会为答案增加足够的价值。
  • @Kostas 我选择了c_str,因为它的名字类似于str。无论如何,c_str()data() 执行与 C++11 相同的功能。
【解决方案2】:

std::string::begin() 将迭代器返回到字符串的第一个字符。迭代器是指针的泛化,充当容器和算法之间的粘合剂,因此可以将两者解耦。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2018-12-03
    • 2020-09-22
    • 2022-08-07
    • 1970-01-01
    • 2017-06-06
    • 2020-10-14
    相关资源
    最近更新 更多