如何访问std::vector中std::string最后两位并转为整数?求最优方案
解决std::vector中std::string最后两位字符转整数的问题
看起来你在提取std::vector里每个std::string的最后两位字符并转成整数时遇到了代码逻辑问题,我来帮你修正并给出更优的实现方式~
先说说你代码里的问题
你的尝试代码存在几个关键错误:
- 第二个循环中,你错误地使用了
v[s[s.size()-1]],这里的s是输入阶段的临时变量,并非当前遍历到的v[i]对应的字符串,而且s的长度也不是当前元素的长度,这会导致索引越界或者访问到错误的元素。 - 判断条件的逻辑和你的需求不匹配,你原本要提取最后两位转整数,但代码里的条件和输出逻辑完全偏离了目标。
最优实现方案
下面是修正后的代码,同时加入了一些优化点,让代码更简洁、安全:
#include <iostream> #include <vector> #include <string> using namespace std; int main() { int n; string s; cin >> n; vector<string> v; // 提前预留空间,避免vector多次扩容,提升性能 v.reserve(n); for (int i = 0; i < n; ++i) { cin >> s; // 过滤长度不足2的字符串,防止后续访问越界 if (s.size() >= 2) { v.push_back(s); } else { cout << "跳过长度不足2的字符串:\"" << s << "\"" << endl; } } // 使用范围for循环(C++11及以上支持),更简洁易读 for (const auto& str : v) { // 获取最后两位字符,str.back()是C++11新增的方法,等价于str[str.size()-1] char second_last = str[str.size() - 2]; char last = str.back(); // 字符转整数,利用ASCII码的差值 int num_second_last = second_last - '0'; int num_last = last - '0'; // 按需求输出结果 cout << "字符串\"" << str << "\"对应的最后两位整数:" << num_second_last << " 和 " << num_last << endl; } return 0; }
优化点说明
- 提前预留vector空间:用
v.reserve(n)提前分配足够的内存,避免vector在push_back时多次扩容,提升处理大量数据时的性能。 - 范围for循环:代替传统的索引循环,代码更简洁,也避免了索引错误的可能。
- 字符串长度检查:提前过滤掉长度不足2的字符串,防止后续访问
str[str.size()-2]时出现越界的未定义行为。 - 直观的字符访问:用
str.back()获取最后一个字符,比str[str.size()-1]更易读。
如果你的编译器不支持C++11及以上,只需要把范围for循环改回传统索引循环,str.back()替换为str[str.size()-1]即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者user9857651
相关产品推荐
相关产品推荐

