set< string&gt ;:如何不列出以给定字符串开头并以`/`结尾的字符串? [英] set<string>: how to list not strings starting with given string and ending with `/`?

查看:101
本文介绍了set< string&gt ;:如何不列出以给定字符串开头并以`/`结尾的字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

例如,我们有以下集合:

for example we have in our set:

 bin/obj/Debug/CloudServerPrototype/ra.write.1.tlog 
 bin/obj/Debug/CloudServerPrototype/rc.write.1.tlog 
 bin/obj/Debug/vc100.idb 
 bin/obj/Debug/vc100.pdb 

这就是我根据 g答

#include <iostream>
#include <algorithm>
#include <set>
#include <string>
#include <iterator>

using namespace std;

struct get_pertinent_part
{
    const std::string given_string;

    get_pertinent_part(const std::string& s)
        :given_string(s)
    {
    }

    std::string operator()(const std::string& s)
    {
        std::string::size_type first = 0;

        if (s.find(given_string) == 0)
        {
            first = given_string.length() + 1;
        }

        std::string::size_type count = std::string::npos;
        std::string::size_type pos = s.find_last_of("/");
        if (pos != std::string::npos && pos > first)
        {
            count = pos + 1 - first;
        }

        return s.substr(first, count);
    }
};

void directory_listning_without_directories_demo()
{
    set<string> output;
    set<string> demo_set;

    demo_set.insert("file1");
    demo_set.insert("file2");
    demo_set.insert("folder/file1");
    demo_set.insert("folder/file2");
    demo_set.insert("folder/folder/file1");
    demo_set.insert("folder/folder/file2");
    demo_set.insert("bin/obj/Debug/CloudServerPrototype/ra.write.1.tlog");
    demo_set.insert("bin/obj/Debug/CloudServerPrototype/rc.write.1.tlog");
    demo_set.insert("bin/obj/Debug/vc100.idb");
    demo_set.insert("bin/obj/Debug/vc100.pdb");


    std::transform(demo_set.begin(),
        demo_set.end(),
        std::inserter(output, output.end()),
        get_pertinent_part("bin/obj/Debug/"));

    std::copy(output.begin(),
        output.end(),
        std::ostream_iterator<std::string>(std::cout, "\n"));
}

int main()
{
    directory_listning_without_directories_demo();
    cin.get();
    return 0;
}

此输出:

CloudServerPrototype/
file1
file2
folder/
folder/folder/
vc100.idb
vc100.pdb

我们得到 bin / obj / Debug / string。我们要提示:

and we are given with bin/obj/Debug/string. We want to cout:

vc100.idb 
vc100.pdb 
CloudServerPrototype/

该怎么做?

推荐答案

目前尚不清楚问题的哪一部分被卡住了,所以这里是一个入门者。

It's not clear with which part of the problem you are stuck, so here is a starter for you.

要获取给定的字符串和最后的'/'(如果存在):

To get the parts of the strings between "given string" and the final '/' (where present):

std::string get_pertinent_part(const std::string& s)
{
    std::string::size_type first = 0;
    if (s.find(given_string) == 0)
    {
        first = given_string.length() + 1;
    }

    std::string::size_type count = std::string::npos;
    std::string::size_type pos = s.find_last_of("/");
    if (pos != std::string::npos && pos > first)
    {
        count = pos + 1 - first;
    }

    return s.substr(first, count);
}

要将这些部分插入新集合(输出)以确保唯一性,您可以使用以下代码:

To insert these parts into a new set (output) to guarantee uniqueness you can use the following:

std::transform(your_set.begin(),
               your_set.end(),
               std::inserter(output, output.end()),
               get_pertinent_part);

您可能希望将 given_string 传递到 get_pertinent_part(),在这种情况下,您需要将其转换为函子:

You may wish to pass given_string into get_pertinent_part(), in which case you'll need to convert it to a functor:

struct get_pertinent_part
{
    const std::string given_string;

    get_pertinent_part(const std::string& s)
        :given_string(s)
    {
    }

    std::string operator()(const std::string& s)
    {
        std::string::size_type first = 0;

        //
        // ...same code as before...
        //

        return s.substr(first, count);
    }
};

您可以这样称呼:

std::transform(your_set.begin(),
               your_set.end(),
               std::inserter(output, output.end()),
               get_pertinent_part("bin/obj/Debug"));

要输出新的集合

std::copy(output.begin(),
          output.end(),
          std::ostream_iterator<std::string>(std::cout, "\n"));

将结果排序作为练习。

这篇关于set&lt; string&gt ;:如何不列出以给定字符串开头并以`/`结尾的字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆