【发布时间】:2015-11-25 17:23:18
【问题描述】:
假设我有两个maps。这些maps 的值是相同的,并且构造起来很昂贵(而不是复制)。这些maps 的键是不同类型的,但可以相互转换。我需要设置第一个map 的内容以匹配第二个的内容,但我必须一直循环通过两个maps。有没有办法做到这一点?
作为一个例子,我将键简化为更易于识别的可转换对象,并仅使用 ints 作为值。在示例中,我想设置foo 的内容以匹配bar 的内容。但是如果不循环遍历maps,我就找不到办法。
map<int, int> foo = {{1, 100}, {2, 200}, {4, 400}};
map<char, int> bar = {{'1', 200}, {'3', 300}, {'5', 500}};
for(auto i = foo.begin(); i != foo.end(); ++i) {
if(bar.end() == bar.find(static_cast<decltype(bar)::key_type>(i->first) + '0')){
foo.erase(i);
}
}
for(auto i = bar.begin(); i != bar.end(); ++i) {
const decltype(foo)::key_type key = i->first - '0';
if(foo.end() == foo.find(key) || foo[key] != i->second) {
foo[key] = i->second;
}
}
for(const auto i : foo){
cout << i.first + 10 << ": " << i.second << endl;
}
这正确输出:
11:200
13:300
15:500
有没有一种不需要循环遍历maps 的方法?
【问题讨论】:
-
键的顺序是否相同?
-
在这种情况下,您可以通过并行循环两个地图并合并来更快地获得相同的结果。这避免了
bar.find()调用,但您仍然需要迭代这两个映射。我不知道有什么办法。 -
如果钥匙是可转换的,为什么你需要两个?
-
@GlennTeitelbaum 这是我正在设计的一个不幸的人工制品。事实上我不需要两者,如果我被允许我会删除一个。然而,此时我一直在做转换,所以我至少想把它做对。
-
@rici 我认为您的回答与我将要做的一样好。如果您想发帖,请不要这样做,否则我可以写出来。
标签: c++ dictionary key assignment-operator