检查一个向量是否包含另一个向量的子字符串

check if a vector contains a substring of another vector

我有文件名,我需要检查这些文件是否以向量扩展名的任何扩展名结尾;我想使用库中的一些算法而不是我自己做的,有什么办法吗?

#include <iostream>
#include <algorithm>
#include <vector>

std::string tail(const std::string &st, const size_t len)
{
    if (len >= st.size())
        return st;
    return st.substr(st.size() - len);
}

std::vector<std::string> filtered_files(const std::vector<std::string>& files, const std::vector<std::string>& extensions) {

    std::vector<std::string> re;
    for(const std::string f : files) {
        for(const std::string ex : extensions) {
            if(ex == tail(f,ex.size())) {
                re.push_back(std::move(f));
                break;
            }
        }
    }
    return re;
}

int main(int argc, char **argv) {

    std::vector<std::string> v{"main.cpp","main.c","main.py"};
    std::vector<std::string> re = filtered_files(v,{".c",".cpp"});
    for(const std::string s  :re) {
        std::cout << s << '\n';
    }

}

查看 std::find_if() standard algorithm in place of the inner loop. You can use the std::string::compare() 方法来执行子字符串比较,而不必实际分配新的 std::string 对象,就像您的循环和 tail() 函数当前所做的那样。您唯一需要的字符串分配是推入 re 的字符串(如果您 return 指向 te [=17 中的字符串的 std::vector<std::string*> 指针,甚至可以避免分配=]向量)。

试试这个:

#include <iostream>
#include <algorithm>
#include <vector>

std::vector<std::string> filtered_files(const std::vector<std::string>& files, const std::vector<std::string>& extensions)
{
    std::vector<std::string> re;

    for(const std::string &f : files)
    {
        if (std::find_if(extensions.begin(), extensions.end(),
            [&](const std::string &ex){
                return (f.size() >= ex.size()) && (f.compare(f.size()-ex.size(), ex.size(), ex) == 0);
            }
        ) != extensions.end())
        {
            re.push_back(f);
        }
    }

    return re;
}

Live Demo

其实有很多方法可以解决这个问题,我个人是这样实现的

#include <iostream>
#include <algorithm>
#include <string>
#include <functional>
#include <vector>

int main()
{
    std::vector<std::string> v{"main.cpp","main.c","main.py"};
    std::vector<std::string> ext{".cpp", ".c"};
    std::vector<std::string> res;

    for (auto& s : v) {
        auto pos = s.find_last_of('.');            
        if (pos != s.npos) {
            char* str = &s[pos];
            if (std::any_of(ext.begin(), ext.end(), 
                            [str](const string& a) { return str ==  a; })) {
                res.push_back(s);
            }
        }
    }

    for (auto& r : res)
        cout << r << endl;

    return 0;
}