繁体   English   中英

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

[英]How to check if a value exists within a C++ Map

我正在尝试使用动态编程来实现斐波那契。 这是我的.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'

在我看来,这是一个非常简单的错误,但是我不确定所有这些东西意味着什么。 有人可以帮我吗,我真的很想精通这种语言,这似乎很有用。

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

map.find()

您的代码有几个问题。

最大的问题不是语法,而是缓存的位置:由于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内的对应值将自动更新。

演示

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

valueFinder = fibonacci_storage.begin();

查找元素可以使用源代码完成

valueFinder = fibonacci_storage.find(value);

值是您要搜索的键。 现在,您检查值是否在地图中:

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

到此为止。

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

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

似乎您的问题更多是关于编译错误。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM