如何检查C ++ Map中是否存在值

时间:2015-06-19 16:43:23

标签: c++

我正在尝试使用动态编程来实现斐波那契。这是我的.h文件:

#ifndef DYNAMICPROGRAMMING_H
#define DYNAMICPROGRAMMING_H
#include <map>

class DynamicProgramming
{
    public:
        DynamicProgramming ();
        ~DynamicProgramming ();
        int Fibonacci(int value);
    private:
};

#endif // DYNAMICPROGRAMMING_H

这是我的.cpp文件中的相关部分:

    int DynamicProgramming::Fibonacci(int value)
{
    int result;
    std::map<int,int>fibonacci_storage;
    std::map<int,int>::iterator valueFinder;
    if (value == valueFinder->second){
        return fibonacci_storage[value];
    }

    if (value <= 2 ){
        result = 1;
    } else {
        result = Fibonacci(value - 1) + Fibonacci(value - 2);
    }
    fibonacci_storage.insert(std::pair<int,int>(value,result));
    return result;
}

我的错误来自这一行:if (value == valueFinder->second)。这就是它所说的:

could not convert '((DynamicProgramming*)this)->DynamicProgramming::fibonacci_storage.std::map<_Key, _Tp, _Compare, _Alloc>::find [with _Key = int, _Tp = int, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, int> >, std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const int, int> >, std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int]((*(const key_type*)(& value)))' from 'std::map<int, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const int, int> >}' to 'bool'

在我看来,这是一个非常简单的错误,但我不确定这些东西是什么意思。有人可以帮助我,我真的很想掌握这种语言,看起来它会非常有用。

4 个答案:

答案 0 :(得分:1)

据我所知,搜索地图值的唯一方法是迭代。如果您正在尝试查看密钥是否存在,那么您可以使用

map.find()

答案 1 :(得分:1)

您的代码存在一些问题。

最大的不是语法,它是缓存的位置:因为fibonacci_storage是一个局部变量,Fibonacci的每个递归调用都有自己的缓存,这意味着没有缓存一点都不您需要将fibonacci_storage移到班级的private:部分。

就修复语法而言,用于实现缓存搜索的常用技巧是将[]的结果存储在引用中,如下所示:

int DynamicProgramming::Fibonacci(int value)
{
    int &result = fibonacci_storage[value];
    if (result) {
        return result;
    }
    if (value <= 2 ){
        return (result = 1);
    }
    return (result = Fibonacci(value - 1) + Fibonacci(value - 2));
}

变量result包含对map内部值的引用,因此当您在两个assign-return语句之一中更新它时,map中的相应值会自动更新

Demo.

答案 2 :(得分:0)

valueFinder只是std::map<int,int>类型的迭代器,它与该类型的任何实例都没有关联。
要将它与实例(此处为fibonacci_storage)相关联,您必须将其分配给该实例,即

valueFinder = fibonacci_storage.begin();

可以使用source

查找元素
valueFinder = fibonacci_storage.find(value);

其中value是您要搜索的密钥。现在,检查值是否在地图中:

if( valueFinder != fibonacci_storage.end() )
{
    // value found
}

你已经完成了。

答案 3 :(得分:0)

要检查C ++映射中是否存在密钥,可以使用std :: map :: count。它返回0(密钥不存在)或1(密钥存在)。

要检查C ++映射中是否存在值,我认为您必须迭代所有对。

看来您的问题更多的是关于编译错误。

上面的代码中有几个问题。

  • 您的迭代器valueFinder不会迭代任何内容。要迭代,您需要在地图上调用begin()方法。
  • 变量fibonacci_storage基本上没用,因为它不是对象的成员,因此每次调用Fibonacci方法时都会有一个不同的变量实例。
  • 从技术上讲,您不必进行迭代,因为Fibonacci序列的索引是地图中的键,而Fibonacci序列的值是地图中的值。