- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 C++ 的 count_if
函数来查看 std::string
中有多少个十六进制数字。当我尝试以下操作时:
string s = "123abc";
cout << count_if(s.begin(), s.end(), isxdigit) << endl;
我收到以下错误:
count.cpp:14:13: error: no matching function for call to 'count_if'
cout << count_if(s.begin(), s.end(), isxdigit) << endl;
^~~~~~~~
/usr/include/c++/4.2.1/bits/stl_algo.h:448:5: note: candidate template ignored: couldn't infer
template argument '_Predicate'
count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
但是,当我使用 ::isxdigit
时,程序会编译并运行。我知道在 ::
之前添加与在全局范围内使用 isxdigit
有关,但我不确定为什么它在这种情况下有帮助。我也认为它与 C++ 语言环境有关,但我对它们不太熟悉。
谢谢!
最佳答案
有一个函数int isxdigit(int)
在 C 标准库中( header <ctype.h>
,C++ 等效 header <cctype>
)。这可以在 count_if
中明确使用.
如果您包括 <ctype.h>
, 这个函数在全局命名空间中结束。如果包括 <cctype>
, 它保证放在命名空间 std
中;但由于它是一个 C 库函数,您的 C++ 标准库(实现)也可以将其放入全局命名空间。
另一方面,有一个函数模板 isxdigit
在 C++ 标准库中( header <locale>
)。这只放入命名空间 std
.
你得到这个错误的原因是因为你可能有一个 using namespace std;
某处,或以其他方式制作std::isxdigit
来自 <locale>
可见的。然后,名字isxdigit
指的是一组重载函数。由于有多个候选人,并且count_if
接受其中的许多,编译器现在不能你指的是哪个重载。
您可以指定是哪个重载,例如,使用 static_cast<int(*)(int)>(&isxdigit)
.
当您使用 ::isxdigit
时, 只找到一个函数,所以编译器知道它的类型并可以推导出模板参数。
比手动选择重载更有用的解决方案是使用具有通用函数调用运算符的函数对象:
struct Isxdigit
{
template<class T>
bool operator()(T const& p) const
{
using std::isxdigit;
return isxdigit(p);
}
};
int main()
{
string s = "123abc";
cout << count_if(s.begin(), s.end(), Isxdigit()) << endl;
}
这会自动选择合适的重载。
在 C++1y 中,您可以使用通用 lambda:
int main()
{
string s = "123abc";
cout << count_if(s.begin(), s.end(), [](auto p){ return isxdigit(p); })
<< endl;
}
关于C++ count_if 函数 - 无法推断模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019636/
示例我有一个具有整数值的 vector ,我想计算该 vector 中没有指定我自己的运行时输入的元素。exam vector 有元素 10 , 20 ,30,40在运行时我接受输入 k;并且想要计算
我正在尝试将匿名结构传递给 std::count_if,但编译失败。 当我尝试编译时(使用 g++ 4.5.3,不使用 c++03 或 c++11 扩展),我在 fail() 方法中遇到错误,但是pa
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我尝试使用 lambda 表达式和 count_if() 在 vector 中查找相同的字符串值,但没有成功。错误信息是: variable 'str' cannot be implicitly ca
我尝试使用 lambda 表达式和 count_if() 在 vector 中查找相同的字符串值,但没有成功。错误信息是: variable 'str' cannot be implicitly ca
考虑下面的代码,其目的是重载 std::count_if() 以使用容器作为参数而不是像往常一样使用输入和输出迭代器。 // overload for call with predicate temp
我创建了一个函数,给定某种类型 T 的列表和一个谓词(指向指定函数的指针),计算列表中有多少元素返回 true。 这适用于原子谓词(isEven、isOdd、is_less_than_42),但如果我
为了重温我的 C++,我从网络搜索中找到了一个我需要的辅助函数,并在 C++ 引用资料中查找之前试用了它: int count_vowels(const std::string &input) {
我有一个带有名称和编号的结构: struct S { string name; int number; }; S 的对象存储在 vector 中。 vector 根据 name 排序。可能有超
我目前正在尝试使用 lambda 函数来 std::count_if 数组中两个连续元素的总和等于一个数字。下面给出了示例代码。 #include #include #include int m
我正在尝试使用 C++ 的 count_if 函数来查看 std::string 中有多少个十六进制数字。当我尝试以下操作时: string s = "123abc"; cout ,C++ 等效 h
我正在运行一个简单的 STL 算法来计算小于 50 的元素的数量。该程序生成错误“调用的对象类型‘int’不是函数或函数指针”。我整晚都在解决这个问题,并在没有成功的情况下寻找关于 stackover
我正在使用 STL 函数 count_if 来计算所有正值在 double vector 中。例如我的代码是这样的: vector Array(1,1.0) Array.push_back(-1.
我有一个 double 类型的多维数组( double someArray[10][20] )。我想: a) 使用 std::count_if()迭代该数组的单个列,返回大于某个数字的值的数量 b)
我正在使用 expss::count_if。 虽然像这样的东西工作正常(即,只计算值等于“1”的值): (number_unemployed = count_if("1",unemployed_fie
我想实现 RANSAC。我生成了 60k 点和 500 个平面,我想为每个平面计算它们附近有多少点。然后选择具有最大值的那个。 生成 vector (d_vec) 和平面 (d_pl) 并将它们传输到
对于一项任务,我正在做一些简单的数据采样以确定哪些样本包含计算能量总数的音频。我一直在研究 std::count_if 函数,虽然这在一定程度上符合我的需要,例如: int foo = std::co
这个问题在这里已经有了答案: Why does the C++ standard algorithm "count" return a difference_type instead of size
这是 gcc std::count_if 代码 template typename iterator_traits::difference_type count_if(_InputIterat
我需要计算数字范围在 vector 中出现的频率 比如我想知道2,3,4在下面的 vector vec中出现了多少次。 std::vector vec = {0,3,1,3,2,4,0,1,3,4,2
我是一名优秀的程序员,十分优秀!