我正在尝试阅读PATH
环境变量并使用vector
功能删除其中存在的所有重复项,例如 - sort
,erase
和{{1 }}。但正如我所见,vector会用换行符分隔默认的每个元素。当我将路径设为unique
时,其路径为C:\Program Files(x86)\...
C:/
。到目前为止,这是我的代码:
Program
是分隔符问题吗?我需要在每个char *path = getenv("PATH");
char str[10012] = "";
strcpy(str,path);
string strr(str);
vector<string> vec;
stringstream ss(strr);
string s;
while(ss >> s)
{
push_back(s);
}
sort(vec.begin(),vec.end());
vec.erase(unique(vec.begin(),vec.end()),vec.end());
for(unsigned i=0;i<vec.size();i++)
{
cout<<vec[i]<<endl;
}
进行pus_back并搜索重复项。在这方面,任何人都可以帮助我。
答案 0 :(得分:2)
我会用一个字符串流来剪切它,并使用一个集合来确保没有重复。
std::string p { std::getenv("PATH") }
std::set<string> set;
std::stringstream ss { p };
std::string s;
while(std::getline(ss, s, ':')) //this might need to be ';' for windows
{
set.insert(s);
}
for(const auto& elem : set)
std::cout << elem << std::endl;
如果由于某种原因需要使用向量,则需要使用std::sort
对其进行排序,然后使用std::unique
删除重复项,然后使用擦除擦除冗余。
std::sort(begin(vec), end(vec));
auto it=std::unique(begin(vec), end(vec));
vec.erase(it, end(vec));
编辑:链接到文档
http://en.cppreference.com/w/cpp/container/set
答案 1 :(得分:1)
对于此任务,最好使用std::set<std::string>
,这将自动消除重复。要阅读PATH
,请使用strtok
将其拆分为子字符串。
答案 2 :(得分:1)
您需要使用不同的分隔符(':'或';'来分隔PATH中的目录,具体取决于系统)。例如,您可以查看std :: getline()函数来替换当前的while()/ push_back循环。此功能允许您指定自定义分隔符,并且是代码中的替代品。
答案 3 :(得分:0)
除了字符串的格式化输入运算符(std::vector<T>
)使用空格作为分隔符之外,operator>>()
除了分隔任何东西之外没有那么多。其他已发布的有关使用std::getline()
等的信息。还有另外两种方法:
std::string
输入运算符使用流的std::locale
对象来获取可以替换的std::ctype<char>
方面。 std::ctype<char>
方面具有进行字符分类的功能,并且可以用于将例如字符';'
视为空格。它有点牵扯,但比下一个方法更加坚固。我认为路径组件不能包含换行符,即一种简单的方法可能是在读取组件之前用换行符替换所有分号:
std::string path(std::getenv("PATH"));
std::replace(path.begin(), path.end(), path.begin(), ';', '\n');
std::istringstream pin(path);
std::istream_iterator<std::string> pbegin(pin), pend;
std::vector<std::string> vec(pbegin, pend);
这种方法可能存在PATH
可能包含包含空格的组件的问题:这些组件将被拆分为单个对象。您可能希望将空格替换为另一个字符(例如,现在未使用的';'
)并将其恢复为适当的空格。