- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 std::map
有一对“唯一键”和“唯一值”。我通常会为一个值找到一个键,并为一个键找到一个值。我已经知道使用 std::find_if
+ lambda 的方法,但是我想知道是否有更好的方法。
搜索后,我找到了this article我学会了如何使用 `std::binary_function'。使用这两种方法,我检查了“耗时”。这是我的代码。
typedef int USER_ID;
typedef std::string USER_NICK_NAME;
typedef std::map<USER_ID, USER_NICK_NAME> USER_MAP;
template<class T>
struct map_data_compare : public std::binary_function<typename T::value_type, typename T::mapped_type, bool>
{
public:
bool operator() (typename T::value_type &pair, typename T::mapped_type i) const
{
return pair.second == i;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
USER_MAP user_map;
string nick_prefix = "test";
//make test map
for (int i = 0; i < 100000; i++)
{
std::ostringstream stream;
stream << i;
user_map.insert(USER_MAP::value_type(i, nick_prefix + stream.str()));
}
const USER_NICK_NAME nick_name = "test99999";
clock_t t;
//Method 1 : using find_if + lambda
cout << "Method 1 : using find_if + lambda" << endl;
t = clock();
auto it = std::find_if(user_map.begin(), user_map.end(), [&](const USER_MAP::value_type& user)
{
return nick_name == user.second;
});
if (it != user_map.end())
{
cout << "found nickname " << nick_name.c_str() << ", at index " << it->first << endl;
}
t = clock() - t;
cout << "elapsed " << ((float)t)/CLOCKS_PER_SEC << " seconds" << endl;
cout << endl << endl;
//Method 2 : using find_if + binary_function
cout << "Method 2 : using using find_if + binary_function" << endl;
t = clock();
it = std::find_if(user_map.begin(), user_map.end(), std::bind2nd(map_data_compare<USER_MAP>(), nick_name));
if (it != user_map.end())
{
cout << "found nickname " << nick_name.c_str() << ", at index " << it->first << endl;
}
t = clock() - t;
cout << "elapsed " << ((float)t)/CLOCKS_PER_SEC << " seconds" << endl;
return 0;
}
在我的机器上,方法 1 总是比方法 2 快。这是测试结果控制台。
所以,我的问题是,
find_if
+ lambda 是最好的方法吗?(不幸的是,我不能使用 boost 库。)std::binary_function
时?感谢您花时间查看此主题并尝试提供帮助。
最佳答案
In my situation(I mean searching map by value), find_if + lambda is the best way?
这当然是最简洁的方法(假设您不能使用第二张 map ,或者可能是提升式多索引 map 来快速查找值)。原则上,使用等效的仿函数和/或 bind
应该不会慢很多,这里唯一的区别是 nick_name
是通过值而不是引用来捕获的;也许您没有启用优化,或者您的编译器没有像人们希望的那样优化 bind2nd
。
When I use
std::binary_function
?
从历史上看,如果您没有从它继承以将类型别名(first_argument_type
、second_argument_type
和 result_type
)注入(inject)到您的仿函数中不想自己定义它们。这些有时是必需的,例如,当使用像 bind2nd
这样的适配器(也被弃用)来创建一个基于你的仿函数的新仿函数时。
I know that in C++ 11,
std::binary_function
has bee deprecated. Could I know the reason?
它定义的类型对于像 bind
这样的新型可变参数适配器来说既不是必要的也不是足够的,所以它不再做任何有用的事情。
关于c++ - std::find_if 、 std::binary_function 用于按值搜索 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21235628/
我正在尝试在 1 文件 .cpp 文件中构建以下代码块: #include #include using namespace std; class test { public: int a
我正在尝试了解 find_if 函数的工作原理,并且我正在按照此引用中的示例进行操作: http://www.cplusplus.com/reference/algorithm/find_if/ 当我
我根据第一个字母从数组中查找所有字符串: #include #include #include int main(){ const std::string strArray[] = {"an","b
所以我有一个名为 Song 的类,还有一个名为 SongLibrary 的类。歌曲库仅包含一组所有歌曲和适当的方法。 我目前正在尝试制作一个搜索歌曲库并检查歌曲是否具有特定标题的功能。 我遇到的问题是
我第一次在 C++ 代码中使用 std::find_if 函数。我想要执行的示例和逻辑非常简单,但不知何故我无法使其工作。 我以这种方式创建了“finder”类: /** * @class m
#include #include using namespace std; int main() { int matrix[9] = { 1,0,0,0,1,0,0,0,5 };
在我的 main.cpp 中: using namespace std; #include #include #include #include #include #include #in
我遇到过 set::find 不是查找对象的正确方法的情况,因为我找到对象的方式(通过 std::find_if)不同于它在集合中的排序方式。我没有找到任何关于以这种方式查找元素的复杂性信息。我假设它
我收到错误: no matching function for call to ‘findByPosition::findByPosition(std::vector::size_type&, std
如何检查 find_if 是否找到匹配项?当我尝试下面的代码时: SparseMatrix& SparseMatrix::operator+=(const SparseMatrix &other) {
在 std::vector 中,我想找到最大数小于某个数的元素的位置。例如: v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 我想找到一个最大小于 8 的数字。那个数字是 7。
我有一个填充字符串 vector 的实例方法。我试图找到包含特定子字符串的一个 vector 条目(目前,该子字符串是固定的 - 简单)。 我有一个.h: namespace Data { names
下面的代码有什么问题?如果结构的第一个成员等于 0,它应该在结构列表中找到一个元素。编译器提示 lambda 参数不是谓词类型。 #include #include #include #incl
谓词函数: bool Schedule::predicateFunc(map,pair >::iterator it,string &a) { return (it->first).first
使用 std::find_if 我们可以找到一个元素是否存在于普通的一维数组中。 灵感来自 this question ,我想知道,我们是否可以提供一个算法函数来检查任何类型和任意数量元素的二维数组(
我正在尝试在具有 Lambda 表达式的函数中使用 find_if。我想获取 vector 的最后一个迭代器,但我不确定如何编写它。 我可以用这段代码得到第一个迭代器。在这段代码中,struct 有一
这是我的代码片段: #include #include #include using namespace std; bool next(int j) { return(j>m; int
我正在研究从另一个 SO 帖子中获得的以下示例。示例是这样的 class checker { public: bool operator()(unsigned int i) {
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
对于从 find_if 到对象的映射指针,我应该使用示例 1 还是示例 2哪个最好? struct test { INT id } std::vector> vec; int ID = 75; au
我是一名优秀的程序员,十分优秀!