C++:查找方法

C++: Find method

本文关键字:方法 查找 C++      更新时间:2023-10-16

所以如果我输入patricia(不用担心我会把它转换为上层(,该字符串将被加载到我的向量中。我的问题是关于查找函数的。我在倒数字符对吗?因此,如果我输入 Patricia 并且 j 将在 ABBOT 上,PATRICIA 逗号中的值将为 5。到目前为止,我很好,但是我找到的变量会发生什么?

bool NameSearch::findFirstNames(vector<string> &vsFirst, string name)
{ 
int j = 0;
bool bName = false;
vsFirst.clear();
while(j < total)
{  
    int comma;
    comma = names[j].find(',');
            //Confused here
    int found = names[j].find(name, comma);
    if(found > -1)  
    {
        vsFirst.push_back(names[j]);
        bName = true;
    }
        j++;
} 
return bName;
}

if (found > -1)测试可能适用于您的平台,但在技术上是可疑的。

std::string::find()的返回类型是 std::string::size_type ,如果未找到您要搜索的子字符串,则返回值std::string::npos(另一方面,如果找到子字符串,则返回值是其第一次出现的字符索引(。

现在std::string::npos值恰好是类型 std::string::size_type 的最大可能值,如果在您的实现中unsigned int,这意味着与已签名的 int -1 进行比较将产生 true

但是,一般不能对std::string::size_type类型做出假设 因此,我建议将测试重写为:

if (found != std::string::npos)
{
    ...
}
这是

误导性代码。 std::string::find()返回一个size_t,而不是一个int

int comma;
comma = names[j].find(',');

这是误导性代码。 当std::string::find()失败时,它返回 std::string::npos ,而不是-1。 在您的环境中,这相当于巧合-1

if(found > -1)  

if 语句通过确保它不是std::string::npos来有效地尝试检查">是否找到结果"。

还有另外两个答案,指出了这段代码的问题所在,但我觉得它们都没有向你解释,作者在做什么,这就是你想要的解释。 :)

让我们先看一下以下代码片段。

int comma;
comma = names[j].find(',');

如前所述,应将其改写为:

size_t comma;
comma = names[j].find(',');

find方法在std::string中有 4 个重载上面的代码使用了这个:

size_t find (char c, size_t pos = 0) const;

它返回索引,在该索引处,作为第一个参数传递的字符(在您的情况下是','(出现在字符串中,如果未找到该字符,则std::string::npos。显然,作者确定','字符必须存在于字符串names[j]中,并且不会检查结果。

在行中:

int found = names[j].find(name, comma);

再次应重写为:

size_t found = names[j].find(name, comma);

使用以下 find 方法的重载:

size_t find (const string& str, size_t pos = 0) const;

这个搜索字符串names[j]以查找作为第一个参数传递的字符串的第一次出现(在您的例子中name(,如果有匹配项或std::string::npos,则返回匹配开始的索引。

如您所见,find方法的两个重载都有第二个参数,默认值为 0 。第二个参数允许用户指定在搜索字符串中以哪个索引开始搜索(在您的情况下names[j](

电话:

comma = names[j].find(',');

等效于调用:

comma = names[j].find(',', 0);

这意味着:如果该字符串中没有此类字符,则','从开头开始查找字符串names[j]的字符,并返回该字符或std::string::npos第一次出现的索引。

电话:

size_t found = names[j].find(name, comma);

means:在字符串names[j]中查找等于 name 的子字符串,但从找到逗号的位置开始,如果该字符串中没有这样的子字符串,则返回该子字符串第一次出现的索引,std::string::npos,则返回逗号之后的索引。

也许comma_position而不是comma会是变量的更好名称。