是否有更优雅的方法来有条件地插入到 std::maps 的 std::map 中?

发布于 2024-10-31 04:51:13 字数 1187 浏览 0 评论 0 原文

我有嵌套容器 std::map; > 并希望正确填充它们,插入新的子映射或附加到子映射(如果整数键存在)。所以我想出了类似下面的例子:

int n = ...;
int m = ...;
obj get_some_random_obj(int i, int j);        // returns some object 

std::map<int, std::map<int, obj> > container; // prepopulated container

// insert some new obj's. Create a new sub map if key i is not found in container, 
// append to existing sub map otherwise
for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j) {
        std::map<int, std::map<int, obj> >::iterator found = container.find(i);
        obj newobj = get_some_random_obj(i,j);
        std::pair<int, obj> newpair(j, newobj);
        if(found != container.end()) {
            found->second.insert(newpair);
        } else {
            std::map<int, obj> newmap;
            newmap.insert(newpair);
            container.insert(std::make_pair(i, newmap));
        }
    }
}

两个问题:

  • 是否有更优雅(更有效?)的方式来编写这个?
  • 如何使上述代码更加抽象,以便可以使用 Ustd::map 类型填充容器code> 和 T 任意类型?我试图提出一个模板函数,但根本无法让它工作。

感谢您的帮助!

I have nested containers std::map<int, std::map<T, U> > and want to populate them properly, either inserting a new sub map or appending to the sub map if the integer key exists. So I came up with something like the following example:

int n = ...;
int m = ...;
obj get_some_random_obj(int i, int j);        // returns some object 

std::map<int, std::map<int, obj> > container; // prepopulated container

// insert some new obj's. Create a new sub map if key i is not found in container, 
// append to existing sub map otherwise
for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j) {
        std::map<int, std::map<int, obj> >::iterator found = container.find(i);
        obj newobj = get_some_random_obj(i,j);
        std::pair<int, obj> newpair(j, newobj);
        if(found != container.end()) {
            found->second.insert(newpair);
        } else {
            std::map<int, obj> newmap;
            newmap.insert(newpair);
            container.insert(std::make_pair(i, newmap));
        }
    }
}

Two questions:

  • Is there a more elegant (more efficient?) way to write this?
  • How can one make the above code more abstract, so that it becomes possible to populate containers with type std::map<int, std::map<U,T> with U and T arbitrary types? I have tried to come up with a template function, but couldn't get it to work at all.

Thank you for your help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

无法回应 2024-11-07 04:51:13
container[i][j] = get_some_random_obj(i,j);

如果元素不存在,则地图的 operator[] 会插入。

container[i][j] = get_some_random_obj(i,j);

map's operator[] inserts if the element isn't present.

红墙和绿瓦 2024-11-07 04:51:13

如果您使用 operator[] 访问元素,如果尚不存在元素,则会创建一个空元素(这是有效的,因为 std::map::value_type 必须是默认值-constructible):

std::map<int, std::map<int, obj> > foo;
foo[i][j] = some_object;

请注意,如果 foo[i][j] 已经存在,它将被新值替换。

If you use operator[] to access the elements, an empty one will be created if none exists yet (this works because std::map::value_type has to be default-constructible):

std::map<int, std::map<int, obj> > foo;
foo[i][j] = some_object;

Note that, if foo[i][j] already exists, it will be replaced by the new value.

过度放纵 2024-11-07 04:51:13

我在这里不确定,但我认为 std::multimap 可能就是您所需要的。它将处理每个键的多个对象。

I'm not sure here, but I think the std::multimap may be what you need. It will handle multiple objects per key.

方觉久 2024-11-07 04:51:13

std::map 有一个 insert() 函数,它返回一个包含布尔值和迭代器的 std::pair。

如果布尔值为 true,则插入成功;如果布尔值为 false,则键已经存在,并且迭代器与键相对应,因此您可以更新值。

std::map has an insert() function which returns a std::pair containing a boolean and an iterator.

If the boolean is true then the insert succeeded, and if the boolean is false then the key already exists and the iterator corresponds to the key so you can update the value.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文