检查映射中是否存在关键字,然后更新值
checking if key exist in map then updating value
在我的项目中,我想插入映射的键。所有新关键点的值都应为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
我该怎么做。
最简单、最高效的解决方案是:
for (auto const& s : pairs) two[s] += 1.0;
这是因为如果键不存在,映射上的[]
运算符会使用默认值构造函数自动创建一个条目。对于浮点,默认构造函数生成0.0。
由于[]返回一个引用,因此不会执行任何额外的查找来增加值。
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]) );
上面的行可以重写如下
it = two.find(pairs[i] );
STL的设计就是为了高效地做到这一点,看看如何做到这一步是值得的。
但首先,请注意,在您的代码中,行
two.find(string(pairs[i]) );
two[string(pairs[i])]=1.0;
执行两次查找,这有点浪费。
如果查看map::insert
的签名,可以看到返回值是std::pair<iterator, bool>
。第二个是布尔值,指示元素是否实际插入。第一个是前一个元素(如果它存在,在这种情况下它没有被覆盖(或新元素的迭代器。
因此,有效地做到这一点的方法是编写
auto ins = two.insert(make_pair(pairs[i], 0));
ins.first->second += 1;
应该有它!=two.end((而不是it==two.end
我认为第一个条件(I==0(检查也可以跳过
相关文章:
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- cmake更新缓存的变量
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 更新到莫哈韦后出现cmath错误
- 在std::thread中,joinable()然后join()线程安全吗
- OpenMP:并行更新数组总是需要减少数组吗
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 指针没有更新它在void函数内部指向的值
- 如何在c++中获取要更新的值
- 已修改的LinkedList未在文本文件本身中更新
- Qt:当QListView获得新条目时,如何更新QStringList
- C++:如何读取分离变量,然后读取向量
- 比较 JSON::Value 变量中的数据,然后更新到文件
- 如何比较两个向量中的两个值,然后在C++中更新向量值
- 检查映射中是否存在关键字,然后更新值