【发布时间】:2019-12-29 00:15:11
【问题描述】:
当我们在 Visual Studio IDE 中执行 string::begin() 时,它会返回一个指向字符串中第一个字符的迭代器。但是,当我们在即时窗口(或监视窗口)中键入 string::begin() 时,它会返回整个字符串。为什么会这样? 即时窗口不应以这种方式运行,因为 string::begin() 返回的是迭代器,而不是字符串。
以下是 Visual Studio IDE 中的代码:
int main()
{
string s = "abc";
string::iterator it = s.begin();
cout << *it << endl;
return 0;
}
以下是输出: 一个
但是,如果我们在即时窗口中键入 s.begin(),我们会得到以下输出:
s.begin()
"abc"
[ptr]: 0x0133fd08 "abc"
[Raw View]: {...}
s.begin() 在即时窗口中的结果应该是:它应该输出一个指向字符串中第一个元素的迭代器(即它应该输出一个指向'a'的迭代器)。但是 s.begin() 在即时窗口中输出整个字符串。为什么会这样?
【问题讨论】:
-
当你说你期望“它应该输出一个迭代器”时,你能告诉我们你想象的“输出一个迭代器”是什么样子,如果不是这样吗?
-
可能有三个因素在起作用。首先,您的实现(标准库)将
std::string::iterator实现为char *。其次,std::string将字符串数据管理为以 nul 结尾的字符串(也称为“C 样式”字符串)。第三,您的 IDE 或调试器默认将指向 char 的指针(即char *)打印为 C 风格的字符串。其中前两个在 C++11 之前是不需要的,即使它是一个常见的实现选择,而第二个现在在 C++11 之后是有效的。第三个与您的 IDE 或调试器的工作方式有关。 -
@Peter 我们又来了。在答案部分回答谢谢;这不是聊天室。
标签: c++ string iterator visual-studio-2019