基于路径简化问题说明vector较于数组的优势
以前写程序时遇到需要动态添加或删除元素的情况我总是习惯用数组然后维护一个计数器。但自从用了vector我发现它的push_back和pop_back非常方便特别是在做这道“简化路径”的题目的时候介绍vectorvector是C标准库中std::vector类的实例它封装了一个动态大小的数组。与普通数组不同vector可以自动扩容并且在末尾添加或删除元素都非常高效。常用成员函数void push_back(const T value);// 将元素添加到末尾void pop_back();// 删除最后一个元素size_type size() const;// 返回当前元素个数bool empty() const;// 判断是否为空以一道题目为例题目简化路径给定一个字符串path表示指向某一文件或目录的绝对路径将其转化为更加简洁的规范路径。规则如下一个点.表示当前目录直接忽略。两个点..表示返回上一级目录。三个点...或更多点视为普通目录名。多个连续的斜杠///合并成一个斜杠。规范路径必须以/开头目录之间只有一个/结尾不能有/且路径中不能出现.和..。输入样例text/home/ /../ /home//foo/ /a/./b/../../c/ /a/../../b/../c//.// /a//b////c/d//././/..输出样例text/home / /home/foo /c /c /a/b/c如何用vector解决解题思路其实很简单把路径按/分割成一个个部分然后像进文件夹一样遇到普通目录就存起来遇到..就退回上一个目录删除最后一个遇到.就忽略。如果用数组可能会这样写cpp string dirs[1000]; // 假设最多1000层 int cnt 0; // 记录当前存了多少个 ... if (sub ..) { if (cnt 0) cnt--; // 手动让cnt减1 } else if (sub ! .) { dirs[cnt] sub; // 先赋值再把cnt加1 }每次遇到..都需要考虑前面读取了多少个字符了,很麻烦,要时刻记得维护cnt而且还得保证cnt不会越界比如cnt已经是0时不能再减。代码里到处都是cnt很容易写错。但是用vector就轻松多了cpp vectorstring parts; // 不用指定大小 ... if (sub ..) { if (!parts.empty()) { parts.pop_back(); // 直接删除最后一个不用管现在有几个 } } else if (sub ! .) { parts.push_back(sub); // 自动添加到末尾 }完全不需要关心当前存了多少个元素pop_back会自动删除最后一整个上次加入的字符串push_back会自动在末尾添加。代码读起来就像是在描述逻辑“遇到..就退回上一级pop_back”完整代码#define _CRT_SECURE_NO_WARNINGS #includeiostream #includecstring #includevector using namespace std; string fun(string a) { string temp a /; vectorstring parts; int left 1; // 跳过开头的 / // 第一步提取所有路径部分 for (int i left; i temp.length(); i) { if (temp[i] /) { if (i left) { string sub temp.substr(left, i - left); // 处理特殊目录 if (sub ..) { if (!parts.empty()) { parts.pop_back(); // 返回上一级 } } else if (sub ! .) { parts.push_back(sub); // 普通目录名 } // . 直接忽略 } left i 1; } } // 第二步构建结果 if (parts.empty()) return /; string ans; for (const string p : parts) { ans / p; } return ans; } int main() { string path; while (cin path) { cout fun(path) endl; } return 0; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2420063.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!