我需要更新// INPUT: d - original map, key - key to be updated,
// new_val - value that will be appended to d[key]
// OUTPUT: vector<int> which is the updated value of d[key]
vector<int> update_value(map<string, vector<int>> d, string key, int new_val) {
map<string, vector<int>>::iterator it = d.find(key);
vector<int> current_vec;
int prev_len = current_vec.size();
if (it != d.end()) {
current_vec = it->second;
current_vec.push_back(new_val);
return current_vec;
}
assert(prev_len + 1, current_vec.size()); // this fails
return current_vec;
}
类型的地图。我创建了这个函数:
<span style='cursor:pointer' data-ng-class='highlightedText:true'>Dheepan raju</span>
我总是得到断言判断失败。
这样做的正确方法是什么?
答案 0 :(得分:3)
您的断言将始终失败,因为如果在地图中找不到current_vec
,key
将始终为空。我建议你删除这个临时向量,如果没有以其他方式找到key
(例如插入),你就处理了这个案例。
您还需要通过引用传递结构d
,以便更新
vector<int>& update_value(map<string, vector<int>>& d, string key, int new_val) {
map<string, vector<int>>::iterator it = d.find(key);
if (it != d.end()) {
it->second.push_back(new_val);
}
else {
vector<int> v;
v.push_back(new_val);
d.insert(make_pair(key, v));
return d[key];
}
return it->second;
}
答案 1 :(得分:2)
如果我做对了,似乎只有在密钥确实存在时才会进行更新,因为更新代码只出现在if
的正文中。
另一方面,仅当条件assert
(即地图中存在关键字)不成立时才会检查it != d.end()
(否则最终return
语句在if
正文中将导致函数结束)。
因此,当到达assert
时,您知道current_vec.size()
(因此prev_len
)为0
,因此断言会缩减为assert(1, 0)
,是假的。
作为旁注,由于您按值传递地图,因此您所做的更新不会反映在原始字典中。同样,请注意您还要将std::vector
复制出地图。