借助分隔符在重复的字符串上矢量push_back

时间:2013-12-31 13:33:25

标签: c++ string vector

我正在尝试阅读PATH环境变量并使用vector功能删除其中存在的所有重复项,例如 - sorterase和{{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并搜索重复项。在这方面,任何人都可以帮助我。

4 个答案:

答案 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

http://en.cppreference.com/w/cpp/algorithm/unique

http://en.cppreference.com/w/cpp/algorithm/sort

答案 1 :(得分:1)

对于此任务,最好使用std::set<std::string>,这将自动消除重复。要阅读PATH,请使用strtok将其拆分为子字符串。

答案 2 :(得分:1)

您需要使用不同的分隔符(':'或';'来分隔PATH中的目录,具体取决于系统)。例如,您可以查看std :: getline()函数来替换当前的while()/ push_back循环。此功能允许您指定自定义分隔符,并且是代码中的替代品。

答案 3 :(得分:0)

除了字符串的格式化输入运算符(std::vector<T>)使用空格作为分隔符之外,operator>>()除了分隔任何东西之外没有那么多。其他已发布的有关使用std::getline()等的信息。还有另外两种方法:

  1. 更改流的空白区域! std::string输入运算符使用流的std::locale对象来获取可以替换的std::ctype<char>方面。 std::ctype<char>方面具有进行字符分类的功能,并且可以用于将例如字符';'视为空格。它有点牵扯,但比下一个方法更加坚固。
  2. 我认为路径组件不能包含换行符,即一种简单的方法可能是在读取组件之前用换行符替换所有分号:

    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可能包含包含空格的组件的问题:这些组件将被拆分为单个对象。您可能希望将空格替换为另一个字符(例如,现在未使用的';')并将其恢复为适当的空格。