C++:查找方法
C++: Find method
所以如果我输入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
会是变量的更好名称。
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?
- 在目录中查找所有.cpp.h文件(include,src等)的传统方法
- Visual Studio 2015资源视图和资源编译器使用不同的方法在项目目录中查找图标文件.如何修复
- CMAKE:查找/添加Visual Studio或Windows SDK库和标头的正确方法?
- 我最近正在阅读opencv源代码。有没有更好的方法来在opencv库中查找类定义?
- 查找字符串是否包含字符串向量的任何一个元素的最佳方法
- 查找和替换子阵列的最佳方法
- 在矢量中查找映射键的最快方法
- 按名称查找进程 ID 的快速方法
- 需要帮助从12个字节生成新的24字节RGB查找阵列,或者是一种更好的编码方法
- 在参数相关查找之前进行模板替换的任何方法(或解决方法?
- 使用定点方法编码查找根的两个必要条件
- 这是查找向量中元素位置的合法方法吗?
- 在数组中查找模式的最有效方法?
- 查找系统调用需要多长时间的可能方法
- 使用unordered_map方法查找C++中最(多个)常用词
- 查找批号是否具有多个间隔的最快方法