储备知识

C++istringstream用法

istringstream对象可以绑定一行字符串,然后以空格为分隔符把该行分隔开。

C++ getline函数用法

C++中有两种getline函数
第一种:头文件istream中,是iostream类的成员函数
第二种:头文件string中,是普通函数

istream& getline(char*s, streamsize n);
istream& getline(char* s, streamsize n, char delim);

在istream中,getline有两种重载形式,如上述所示,作用是:从istream中读取至多n个字符(包含结束标记符)保存到s对应的数组中。即便没有读够n个字符,如果遇到了delim,读取将会终止,delim不会被保存在s中。

istream& getline(istream& is, string& str, char delim);
istream& getline(istream&& is, string & str, char delim);
istream& getline(istream& is, string& str);
istream& getline(istream&& is, string7 str);

在string头文件中,getline函数有四种重载形式,如上述代码所示。读取的istream是作为参数is传进函数的。读取的字符串保存在string类型的str中。
函数变量:
is:表示一个输入流,如cin或者istringstream对象
str:string类型的引用,用来存储输入流中的流信息。
delim:char类型的变量,所设置的截断字符;在不自定义设置的情况下,遇到’\n’,则终止输入。

对于力扣的题目71简化路径而言,可以利用上述知识点进行处理。

题目描述

你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,’//’)都被视为单个斜杠 ‘/’ 。 对于此问题,任何其他格式的点(例如,’…’)均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

始终以斜杠 ‘/’ 开头。
两个目录名之间必须只有一个斜杠 ‘/’ 。
最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。
返回简化后得到的 规范路径 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/simplify-path
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    string simplifyPath(string path) {
        vector<string> temp;
        istringstream is(path);//将path字符串转变成istream数据流
        string result;
        while(getline(is, result, '/')){//利用getline函数,将数据流is以'/'划分成不同的string对象
            if(!result.empty()&&result!="."&&result!=".."){
            //被划分成的string对象result不是空的,不是'.',不是'..',都将该字符串存入到temp中
                temp.push_back(result);
            }else if(!temp.empty() && result==".."){
            //如果划分成的string对象是'..',且temp不是空的,就弹出其中最后的string元素
                temp.pop_back();
            }
        }
        if(temp.empty()){
            return "/";
        }
        result.clear();
        for(auto s : temp){
            result += "/";
            result += s;
        }
        return result;
    }
};
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐