【问题标题】:How to count strings which contains key without loop [closed]如何计算包含没有循环的键的字符串[关闭]
【发布时间】:2020-07-07 05:23:24
【问题描述】:

我想在不使用任何循环的情况下计算包含我的键的字符串

您可以在下面找到我的代码来做这些事情。我正在寻找答案,我找到了函数 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;
}

【问题讨论】:

  • 你认为你将如何检查你的向量的元素是否包含一些东西而不遍历?
  • 没有 any 循环是不可能的。 std::find 使用循环,std::count 使用循环,比较字符串使用循环。不确定你真正想要什么。为什么还要避免循环?
  • 你使用的函数里面有循环可以吗?因为执行此操作的所有算法都使用循环。没有循环的唯一方法是,如果您在编译时知道 vec 的大小,并且在没有循环的情况下遍历(循环展开)
  • 关于 Jaspers 的回答,我还有一个问题。您是要 count 包含某些前缀的字符串(如您的问题所述)还是要检查 any of strings 是否包含前缀 (因为您当前的代码应该去做)?如果你想计算一些东西,打印“是”不喜欢答案。

标签: c++ vector contains


【解决方案1】:

count_if 似乎是要走的路(即将出现未经测试的代码)

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

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

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; });

虽然第一个版本比这个递归版本要好很多。

【讨论】:

  • 有点迂腐,但i.find(key) 可能仍然涉及两个循环:D
【解决方案2】:

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

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;

【讨论】:

  • 该标准没有将 find_if 的实现指定为该精度。即便如此,我认为提问者不想为自己编写循环的假设是非常清楚的。
  • 不太清楚。 OP 写道“不使用任何循环”,他们写道 find 没有做他们想做的事。他们使用find 错误并意味着“没有手写循环”是一个有效的解释,但它缺少来自 OP 的确认
  • 顺便说一句,如果你的解释是正确的,有很多重复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
相关资源
最近更新 更多