在我的项目中,我想将键插入地图。所有新键都应该获得值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
我该怎么做。
答案 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)检查