检查地图中是否存在密钥然后更新值

时间:2015-05-22 23:56:09

标签: c++ dictionary

在我的项目中,我想将键插入地图。所有新键都应该获得值1.0,但现有键应该增加1。

这是代码

vector <string> pairs; 
map<string, float> two;
map <string, float>::iterator it;

string a = "a";
string b = "b";
string c = "a";

pairs.push_back(a);
pairs.push_back(b);
pairs.push_back(c);

for(int i=0; i<pairs.size(); i++)
{
    it = two.find(string(pairs[i]) );
    if(i==0)
    {
        two[string(pairs[i])]=1.0;
    }
    else if ( it == two.end() ) 
    {
        it->second = it->second + 1.0;
    //after this line ^,my compiler stop working
    }
    else
    {
        two[string(pairs[i])]=1.0;
    }
}

在此之后,对象应该是

a  2
b  1

我该怎么做。

4 个答案:

答案 0 :(得分:1)

java -classpath C:\lucene\lucene-5.1.0\core\lucene-core-5.1.0.jar;C:\lucene\lucene-5.1.0\queryparser\lucene-queryparser-5.1.0.jar;C:\lucene\lucene-5.1.0\analysis\common\lucene-analyzers-common-5.1.0.jar;C:\lucene\lucene-5.1.0\demo\lucene-demo-5.1.0.jar org.apache.lucene.demo.SearchFiles

以上代码行需要更正如下

else if ( it == two.end() ) 
    {
        it->second = it->second + 1.0;

不止于此:

else if ( it != two.end() ) 
             ^^^
    {
        it->second = it->second + 1.0;

以上行可以重写如下

it = two.find(string(pairs[i]) );

答案 1 :(得分:1)

STL旨在有效地完成这项工作,并且看看如何实现这一目标。

但首先,请注意代码中的行

two.find(string(pairs[i]) );

two[string(pairs[i])]=1.0;

执行两次查找,这有点浪费。

如果您查看signature for map::insert,则可以看到返回值为std::pair<iterator, bool>。第二个是一个布尔值,表示元素是否实际插入。第一个是前一个元素的迭代器(如果它存在,在这种情况下它没有被覆盖),或者是新元素。

所以,有效地做到这一点的方法是写

auto ins = two.insert(make_pair(pairs[i], 0));
ins.first->second += 1;

答案 2 :(得分:1)

最简单,最有效的解决方案是:

for (auto const& s :  pairs) two[s] += 1.0;

这是有效的,因为如果键不存在,映射上的[]运算符将使用默认值构造函数自动创建一个条目。对于浮点数,默认构造函数生成0.0。

由于[]返回一个引用,因此不会进行额外的查找以增加该值。

答案 3 :(得分:0)

应该有它!= two.end()而不是它== two.end()

我认为也可以跳过第一个条件(i == 0)检查