【问题标题】:Iterator on a map never atteins map.end()地图上的迭代器永远不会到达 map.end()
【发布时间】:2016-06-22 17:20:19
【问题描述】:

为什么下面代码中的迭代不起作用?我的意思是迭代器是递增的,但评估这个表达式o!=RateCurve.end() 总是给true

我需要这样一个函数,因为我在地图的包装中使用它来构建利率曲线。

#include <iostream>     
#include <algorithm>    
#include <math.h>       
#include <string>       
#include <map>          
#include <exception>    
#include <vector>       
#include <stdio.h>      

using namespace std;


map<double, double>::iterator getIt(map<double, double> o){
    return o.begin();
}

int main ()
{
    map<double, double> RateCurve;

    RateCurve[3.3  ]=0.034 ;
    RateCurve[1.2  ]=0.03  ;
    RateCurve[0.2  ]=.001  ;
    RateCurve[6.1  ]=.023  ;



    map<double, double>::iterator o=getIt(RateCurve);
    while (o!=RateCurve.end()){

        cout << "RateCurve[" << o->first << "] = " << o->second << endl;
        ++o;
    }

}

【问题讨论】:

  • 这与您的问题无关,但是当您可以直接调用 begin() 时,我不明白为什么您需要定义 getIt - 您的函数只不过是后者。
  • for ( auto const&amp; o : RateCurve ) { ... } 干净多了。

标签: c++ iterator maps


【解决方案1】:
getIt(map<double, double> o)

您复制了map,因此迭代器将点返回到与您想要的完全无关的map。更糟糕的是,副本在函数调用结束时被销毁,并且您尝试使用的迭代器不再有效,因此您拥有Undefined Behaviour

getIt 设为引用,由于您实际上并未更改元素,因此您也可以将其设为const。然后需要更改返回类型:

std::map<double, double>::const_iterator
getIt(map<double, double> const& o)
{
    return o.begin();
}

另外,请重新考虑您使用的不良做法 using namespace std;endl

【讨论】:

  • 当数据仅用于阅读时,我什至建议传递一个 const 引用并返回 map&lt;double, double&gt;::const_iterator
  • 所以我应该每次都使用std::而不是使用命名空间吗?
  • @Daveddd 这是我的偏好,也是我认识的最有经验的 C++ 程序员共享的。它使代码更易于阅读,即使键入速度稍慢(而且我有一个 vim 映射,可以一键输入std::)。
  • @Daveddd 您可以显式使用命名空间之外的名称。例如。 using std::cout; using std::endl; 仍然可以让你写 cout &lt;&lt; "Hello" &lt;&lt; endl;,但你不会意外地有模棱两可的名字。
猜你喜欢
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多