首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量搜索

向量搜索
EN

Stack Overflow用户
提问于 2020-09-01 19:36:00
回答 3查看 86关注 0票数 0

基本上,我的字符串向量vector<string> words中有大量的单词。

我需要创建一个函数来搜索向量中所有带有"ly“的单词,并返回它们,例如(golly, helpfully, mostly, nearly)。

我如何使用std::find_if函数来完成此操作,或者是否有其他方法可以完成此操作?

我还需要在我的向量中找到比7字母更长的单词,我还需要在>=7或其他东西中使用std::find_if函数吗?

EN

回答 3

Stack Overflow用户

发布于 2020-09-01 20:07:13

首先,在标准库中有一种比std::find_if更合适的算法,称为std::copy_if (根据您的要求)。

其次,您需要在不同的大小写下获取不同的单词列表。这听起来像是有一个template function,它包装了std::copy_if,还提供了一种方式来提供自定义比较(例如lambda function)功能。

因此,我会提出如下建议:

代码语言:javascript
复制
#include <algorithm> // std::copy_if
#include <iterator>  // std::cbegin, std::cend


template<typename Container, typename Predicate>
auto getElelmentsOf(const Container& container, const Predicate condition) /* noexcept */
{
    Container result;
    std::copy_if(std::cbegin(container), std::cend(container), std::back_inserter(result),
        condition);
    return result;
}

现在你可以写下这样的代码

代码语言:javascript
复制
// all the words with "ly"
const auto words_with_ly = [](const auto& ele) {
    return ele.find(std::string{ "ly" }) != std::string::npos;
};
const auto elemtsOfLy = getElelmentsOf(words, words_with_ly);  // function call


// find words that are longer than 7 letters
const auto words_with_size_7_more = [](const auto& ele) { return ele.size() > 7; };
const auto elemtsOfsize7More = getElelmentsOf(words, words_with_size_7_more);  // function call

()

票数 3
EN

Stack Overflow用户

发布于 2020-09-01 19:51:13

您可以使用std::copy_if来获取满足某些条件的所有元素。

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // for std::copy_if
#include <iterator> // for std::back_inserter

using std::vector;
using std::string;

int main(void) {
    vector<string>words={
        "golly", "hoge", "lyric", "helpfully",
        "mostly", "abcdefg", "nearly", "terrible"
    };
    vector<string> res_ly, res_7;

    // get all words that contains "ly"
    std::copy_if(words.begin(), words.end(), std::back_inserter(res_ly),
        [](const string& x){ return x.find("ly") != string::npos; });

    // get all words that are longer than 7 letters
    std::copy_if(words.begin(), words.end(), std::back_inserter(res_7),
        [](const string& x){ return x.length() > 7; });

    // print what we got
    std::cout << "words with \"ly\":\n";
    for (const string& s : res_ly) std::cout << "  " << s << '\n';
    std::cout << "\nwords longer than 7 letters:\n";
    for (const string& s : res_7) std::cout << "  " << s << '\n';

    return 0;
}

输出:

代码语言:javascript
复制
words with "ly":
  golly
  lyric
  helpfully
  mostly
  nearly

words longer than 7 letters:
  helpfully
  terrible

如果你想使用std::find_if,你可以像这样重复搜索:

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // for std::find_if
#include <iterator> // for std::next

using std::vector;
using std::string;

int main(void) {
    vector<string>words={
        "golly", "hoge", "lyric", "helpfully",
        "mostly", "abcdefg", "nearly", "terrible"
    };
    vector<string> res_ly;

    // get all words that contains "ly"
    for (vector<string>::iterator start = words.begin(); ;) {
        vector<string>::iterator next = std::find_if(start, words.end(),
            [](const string& x){ return x.find("ly") != string::npos; });
        if (next == words.end()) {
            break;
        } else {
            res_ly.push_back(*next);
            start = std::next(next, 1);
        }
    }

    // print what we got
    std::cout << "words with \"ly\":\n";
    for (const string& s : res_ly) std::cout << "  " << s << '\n';

    return 0;
}
票数 2
EN

Stack Overflow用户

发布于 2020-09-01 19:51:22

我可以建议以下解决方案。

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>

std::vector<std::string> copy_strings( const std::vector<std::string> &v, const std::string &s )
{
    auto present = [&s]( const auto &item ) 
    {
        return item.find( s ) != std::string::npos; 
    };

    auto n = std::count_if( std::begin( v ), std::end( v ), present );
                            
    std::vector<std::string> result;
    result.reserve( n );
    
    std::copy_if( std::begin( v ), std::end( v ), 
                  std::back_inserter( result ),
                  present );
                  
    return result;                
}

int main() 
{
    std::vector<std::string> v =
    {
        "golly", "helpfully", "mostly", "nearly"
    };
    
    auto result = copy_strings( v, "ly" );
    
    for (const auto &item : result )
    {
        std::cout << item << ' ';
    }
    std::cout << '\n';
    
    return 0;
}

程序输出为

代码语言:javascript
复制
golly helpfully mostly nearly
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63686871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档