C++ 将迭代器访问到字符串(显示未定义的行为)

C++ 将迭代器访问到字符串(显示未定义的行为),c++,string,iterator,C++,String,Iterator,投入:4 aabc 输出:引发异常 根据我的说法,我只向cur添加了一个字符,cur.end()将指向 在字符串末尾的字符旁边,如果我这样做--cur.end() 那我为什么不能访问它呢 #include<iostream> #include<string> using namespace std; int main() { int n; string s; cin >> n >> s; string cu

投入:4

    aabc
输出:引发异常

根据我的说法,我只向cur添加了一个字符,cur.end()将指向 在字符串末尾的字符旁边,如果我这样做--cur.end() 那我为什么不能访问它呢

#include<iostream>
#include<string>
using namespace std;
int main() {
    int n;
    string s;
    cin >> n >> s;
    string cur;
    int i = 1;
    cur += s[0];
    cout << cur[*(--cur.end())];

}
#包括
#包括
使用名称空间std;
int main(){
int n;
字符串s;
cin>>n>>s;
串电流;
int i=1;
cur+=s[0];
不能这条线

cout << cur[*(--cur.end())];
由于
s
的“aabc”
,您将第一个
char
添加到
cur
。然后,
--cur.end()
(应替换为
std::prev(cur.end())
cur.crbegin()
)是
cur
的第一个字符的迭代器,即
a
。因此,对迭代器的解引用将产生
a
,然后将其用作
std::string::operator[]的参数
。此函数接受
std::size\t
,并且在语言允许的情况下,
char
被隐式转换为
std::size\t
。请尝试以下操作:

std::cout << std::size_t{'a'} << "\n";

std::cout取消引用
cur.end()
,更不用说
--cur.end()
,不能保证提供一个可以用作
cur
中有效数组索引的值。
curr[*(-cur.end())]
的行为因此是未定义的,除非
s[0]
恰好给出一个介于
0
cur size()之间的值-1
。此代码
cur[*(-cur.end())]
在您的情况下,假设您的ASCII编码等于
cur[97]
,因为
a
的ASCII码是97。因此它失败了,因为您的字符串短于98个符号。您想做什么?但同样的事情也适用于向量井(也就是说,如果我们尝试像上面那样去引用@PeterI我说的是整数,我从来没有尝试过char,但是对于整数它总是有效的。)@Slava@akacodes121-你只是运气好-或者运气不好,这取决于你如何看待它。除非你添加的最后一个元素的值在正确的范围内,否则你的方法会给出未定义的行为。对于向量或字符串也是如此。未定义行为的一个令人讨厌的特征是,它有时似乎可以正常工作——崩溃并不是未定义行为的必然结果,但没有崩溃并不意味着行为定义良好。但同样的事情也适用于向量(也就是说,如果我们尝试像上面那样去引用)“但同样的事情在向量中也起作用”如果将
\0
存储为
cur
中的唯一字符,在这种情况下也会起作用。你想实现什么?@lubgr不,我说的是整数,我从来没有尝试过字符,但使用整数就可以了always@akacodes121整数的值是多少?向量有多大?
std::cout << std::size_t{'a'} << "\n";