Имея std :: set только с именами файлов (a, f / a, f / b, f / f / c и т. Д.), Как вывести каталог по заданному f /? - PullRequest
1 голос
/ 10 октября 2011

Итак, у нас есть набор имен файлов \ urls, таких как file, folder/file, folder/file2, folder/file3, folder/folder2/fileN и т. Д. Нам дана строка типа folder/.Мы хотим найти folder/file, folder/file2, folder/file3 и, что наиболее интересно, folder/folder2/ (мы не хотим перечислять содержимое для llder2, просто показать, что оно существует и его можно искать).Возможна ли такая вещь через STL и Boost, и как это сделать?

Упс - только что обнаружил, что я уже некоторое время назад блокировал это здесь ... но не нашел правильныйответить пока ...

Ответы [ 3 ]

1 голос
/ 10 октября 2011

Относительно простая реализация C ++ 11.Это можно легко изменить на C ++ 03.(предостережение: не скомпилировал и не проверил это).

std::set<std::string> urls;           // The set of values you have
std::string key_search = "folder/";   // text to search for

std::for_each(
    urls.begin(),
    urls.end(),
    [&key_search] (const std::string& value)
{
    // use std::string::find, this will only display
    // strings that match from the beginning of the 
    // stored value:
    if(0 == value.find(key_search))
        std::cout << value << "\n"; // display
});
1 голос
/ 10 октября 2011

Упорядоченные контейнеры имеют набор методов, которые весьма полезны при поиске диапазона итераторов: lower_bound и upper_bound.В вашем случае вы хотите использовать:

std::for_each(
    path_set.lower_bound("folder/"),
    path_set.upper_bound("folder0"), // "folder" + ('/'+1)
    ...);
1 голос
/ 10 октября 2011

Звучит как прекрасная возможность использовать регулярные выражения в Boost / C ++ 11

Что-то вроде

std::set<std::string> theSet;
// Get stuff into theSet somehow

const std::string searchFor= "folder/";

std::set<std::string> matchingSet;
std::for_each(std::begin(theSet), std::end(theSet),
              [&matchingSet, &searchFor] (const std::string & s)
{
    if (/* the appropriate code to do regex matching... */)
        matchingSet.insert(s); // or the match that was found instead of s
});

Извините, я не могу предоставить синтаксис регулярных выражений ... Iнужно изучить это больше.

...