C++中vector<string>下标逐字符赋值失效而+=追加正常的原因
两种写法行为差异的根本原因
- 初始化语句
vector<string> matrix(n)的实际行为:这行代码生成了包含4个std::string元素的vector,每个元素都是默认构造的空字符串,长度为0,不存在可合法通过下标访问的字符存储位。 - 写
matrix[i][j]='.'属于越界的未定义行为:std::string的下标运算符[]不具备自动扩容能力,也不会修改字符串内部记录的长度值,仅允许访问小于当前字符串长度的合法下标。对长度为0的空字符串来说,所有j≥0的下标都超出合法范围:该操作只是强行向目标内存地址写入字符,既没有把字符串的长度更新为对应值,还可能篡改相邻内存的数据,最终打印时要么因为字符串长度仍为0读不到有效内容,要么输出内存中的随机乱码。 - 写
matrix[i]+='.'是合法的字符串追加操作:+=是std::string的内置追加运算符,执行时会自动检查当前剩余存储空间,容量不足时自动完成内存扩容,将新字符写入字符串的有效存储区域,同时同步更新字符串的长度计数。内层循环执行4次后,每个字符串的长度都为4,下标0~3均为合法可访问位置,后续读取、打印逻辑自然可以正常运行。
更简洁的无错实现:不需要双层循环逐字符赋值,初始化vector时直接指定填充规则即可,一行代码就能生成目标4×4点号矩阵:
vector<string> matrix(n, string(n, '.'));
内容的提问来源于stack exchange,提问作者Sneha Sharma
相关产品推荐
相关产品推荐

