C++ 如何计算包含无循环键的字符串

C++ 如何计算包含无循环键的字符串,c++,vector,contains,C++,Vector,Contains,我想计算包含我的键的字符串,而不使用任何循环 你可以在下面找到我做这件事的代码。我正在搜索答案,我找到了函数std:find,但没有任何帮助 #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; int main() { std::vector<string> vec = { "rana

我想计算包含我的键的字符串,而不使用任何循环

你可以在下面找到我做这件事的代码。我正在搜索答案,我找到了函数std:find,但没有任何帮助

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

int main()
{
    std::vector<string> vec = { "ranaf", "ban", "Ploan", "Bar", "barour", "banriir" };
    string key = "an";

    if(std::find(vec.begin(), vec.end(), key) != vec.end()) {
        cout << ("YES") <<endl;
    }

    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
向量向量向量={“ranaf”,“ban”,“Ploan”,“Bar”,“barour”,“banriir”};
string key=“an”;
if(std::find(vec.begin(),vec.end(),key)!=vec.end()){

coutcount\u如果这似乎是一种方法(未测试的代码即将出现)

循环次数略少(也未经测试)

模板
int CountIt(它开始,它结束,func fun){
if(begin==end)返回0;
返回CountIt(标准::下一步(开始),结束,乐趣)+乐趣(*开始)?1:0;
}
int howMany2=CountIt(vec.begin(),vec.end(),
[&key](conststring&i){返回i.find(key)!=std::string::npos;});

尽管第一个版本比这个递归版本优越得多。

问题是您正在搜索与键匹配的字符串。您需要的是查找包含键的字符串。您可以这样做:

std::vector<string> vec = { "ranaf", "ban", "Ploan", "Bar", "barour", "banriir" };
string key = "an";

if (std::find_if(vec.begin(), vec.end(), [key](const string& s)
    {
        return s.find(key) != std::string::npos;
    }) 
    != vec.end()) 
{
    cout << ("YES") << endl;
}

return 0;
向量向量向量={“ranaf”、“ban”、“Ploan”、“Bar”、“barour”、“banriir”}; string key=“an”; if(std::find_if(vec.begin(),vec.end(),[key](常量字符串&s) { 返回s.find(key)!=std::string::npos; }) !=vec.end()) {
您认为如何在不遍历的情况下检查向量的元素是否包含某些内容?如果没有任何循环,这是不可能的。
std::find
使用循环,
std::count
使用循环,比较字符串使用循环。不确定您真正想要的是什么。为什么您甚至想要避免循环?对于您所使用的函数,它是否合适是否使用循环?因为所有执行此操作的算法都使用循环。如果您在编译时知道
vec
大小,并且在没有循环的情况下遍历(循环展开)Jaspers答案,我还有一个问题。是否要计算包含某些前缀的字符串(如您的问题所述)或者您想检查是否有任何字符串包含前缀(正如您当前的代码应该做的那样)?打印“是”如果你想计算一些东西,我不喜欢答案。标准没有规定find_if的实现达到那种精度。即使如此,我认为提问者不想为自己写循环的假设是非常清楚的。不是非常清楚。OP写道“不使用任何循环”他们写道,
find
没有做他们想做的事情。他们使用了
find
错误,意思是“没有手写循环”是一个有效的解释,但它缺少OPbtw的确认。如果你的解释是正确的,有很多重复的,但
i.find(key)
可能仍然涉及两个循环:D
template<typename it, typename func>
int CountIt(it begin, it end, func fun) {
    if (begin == end) return 0;
    return CountIt(std::next(begin), end, fun)+fun(*begin)?1:0;
}

int howMany2 = CountIt(vec.begin(), vec.end(), 
    [&key](const string& i) { return i.find(key) != std::string::npos; });
std::vector<string> vec = { "ranaf", "ban", "Ploan", "Bar", "barour", "banriir" };
string key = "an";

if (std::find_if(vec.begin(), vec.end(), [key](const string& s)
    {
        return s.find(key) != std::string::npos;
    }) 
    != vec.end()) 
{
    cout << ("YES") << endl;
}

return 0;
std::vector<string> vec = { "ranaf", "ban", "Ploan", "Bar", "barour", "banriir" };
string key = "an";

int count = count_if(vec.begin(), vec.end(), [key](const string& s)
    {
        return s.find(key) != std::string::npos;
    });

cout << count << endl;