std::string 是两个迭代器的数组吗?

Is std::string an array of two iterators?

提问人:Hee Hwang 提问时间:10/5/2022 最后编辑:EvgHee Hwang 更新时间:10/5/2022 访问量:98

问:

我不明白以下代码片段的行为。 怎么会这样呢?

#include <bits/stdc++.h>
using namespace std;
int main() {
  string s = "apple";
  string foo = {s.begin(), s.end()};
  cout <<  foo << endl;
}

输出:apple

C++ 字符串 std braced-init-list

评论

4赞 sweenish 10/5/2022
这是一个构造函数调用。
1赞 Yksisarvinen 10/5/2022
这是统一初始化的语法,在 C++11 中引入。这里它用于调用 的构造函数 6。 是 的副本,一个中的更改不会反映在另一个中(如果只存储迭代器,情况就是这样)。std::stringfoosfoo
1赞 paddy 10/5/2022
foo从两个迭代器列表初始化,它从所述迭代器构造一个新字符串。在问题标题中回答您的问题:否。
3赞 Sam Varshavchik 10/5/2022
无论哪本C++教科书教你使用,你都需要把它扔掉,换一本不同的C++教科书。如果您从某个网站上复制了它,没有任何解释,请不要再访问该网站。如果你在某个小丑的Youtube视频中看到这个,取消订阅该频道,你没有学习正确的C++。这不是标准的 C++ 头文件,许多 C++ 编译器没有它,也不会编译显示的代码。<bits/stdc++.h>
2赞 François Andrieux 10/5/2022
@HeeHwang用于“统一初始化”,可以做各种各样的事情来尝试构造一个对象。对于大多数类类型,它将尝试将 的内容与该类型的构造函数之一进行匹配。因为它可以用来初始化字符串,就像数组(例如)一样,但不能转换为,因此忽略构造函数并搜索另一个构造函数。{}{}std::stringstd::string s { 'a', 'b', 'c'};s.begin()s.end()char

答:

2赞 tadman 10/5/2022 #1

不要混淆一个对象的构造方式和它的基本含义。

构造函数可以并且将会接受各种事物。很多时候,这些论点以某种方式被转换,转化为更适合所讨论类的形式。

在本例中,您正在构造一个由一系列字符组成的字符串,或者换句话说,一个任意子字符串。还有许多其他方法,包括从 转换,这是您经常看到的方法:char*

std::string example = "example";

在这里,您可以将其理解为“ 使用值 ”初始化example"example"

评论

1赞 Hee Hwang 10/5/2022
明白了。你当然知道我在哪里感到困惑。谢谢。
1赞 Dúthomhas 10/5/2022
相比之下,A 只是一对迭代器。不同之处在于,a 会复制其数据,而 a 不会。std::string_viewstd::stringstd::string_view