如何在 C++ 中使用指向 map<int、order> 和 map<int,order,greater<>> 的指针

how to use a pointer point to map<int, order> and map<int,order,greater<>> in c++

提问人:seacat 提问时间:10/5/2023 最后编辑:seacat 更新时间:10/6/2023 访问量:124

问:

我想使用指向 和 的指针。map<int,order>map<int,order,greater<>>

在下面的代码中,指针将根据标志指向某人。但是代码无法成功编译。

这样做的原因是,我需要更新基于地图的 ASC 顺序或 DESC 顺序。除迭代顺序外,所有更新操作都相同。更新操作是累积总和。

那么,如何做到这一点呢?

using namespace std;
struct order {
    int qty;
    int sum;
};
void updateOpr(map<int, order >* pmap) {
    order* pre = nullptr;
    for (auto& [key, value] : *pmap) {
        if (pre == nullptr) {
            value.sum = value.qty;
        }
        else {
            //todo some thing
            value.sum = pre->sum + value.qty;
        }
        pre = &value;;
    }
}
int main() {
    map<int, order, greater<>> imap1;
    map<int, order > imap2;
    map<int, order >* pmap = nullptr;
    bool flag = true;
    if (flag) {
        pmap = &imap1;
    }
    else {
        pmap = &imap2;
    }

    int key = 10;
    if (pmap->contains(key)) {
        //todo some thing;
    }

    updateOpr(pmap);
}
C++ 指针 模板 实例化

评论

5赞 Scott Hunter 10/5/2023
你想用这种技术解决什么问题?
3赞 ChrisMM 10/5/2023
map<int,int>并且是不同的类型......您可以使用,但我不推荐它(并且可能不适用于您要做的任何事情)。也许你应该描述你正在尝试做什么/解决什么,然后更容易提供一个更有用的答案。map<int,int,greater<>>void *
1赞 wohlstad 10/5/2023
如上所述,这些是 2 种不同的类型。你可以试试。std::variant
0赞 Alan Birtles 10/5/2023
不幸的是,在 c++ 中,具有不同参数的同一类的模板化类型彼此完全无关,并且不能分配给同一变量,除非存在一些通用基类(在本例中不存在)
8赞 Drew Dormann 10/5/2023
这是一个 XY 问题。如果我们向你展示了如何编译这段代码,你将得到一个什么都不做的程序。

答:

2赞 molbdnilo 10/5/2023 #1

这些类型是不同的,并且没有共同的基类,因此不能这样做。

对于这种情况,当事物看起来很相似但不相关时,模板很有用。

将使用映射的代码移动到函数模板,然后根据需要创建不同的映射并将其传递给函数。

像这样的东西:

template<typename Map>
void do_the_work(Map& m)
{
    // Work with m
}


int main() {
    bool flag = true;
    if (flag) {
        map<int, int, greater<>> imap;
        do_the_work(imap);
    }
    else {
        map<int, int> imap;
        do_the_work(imap);
    }
}
2赞 Yksisarvinen 10/5/2023 #2

我必须说,我不明白为什么评论者认为变体是唯一的选择。通过将地图更改为相同类型,可以很容易地完成:

#include <functional>
#include <iostream>
#include <map>

int main() {
    using CompareType = std::function<bool(int, int)>;
    using MapType = std::map<int, int, CompareType>;

    MapType mapAscending{std::less<int>{}};
    MapType mapDescending{std::greater<int>{}};
    MapType* mapPtr = nullptr;

    bool shouldBeDescending;
    std::cin >> shouldBeDescending;

    if (shouldBeDescending) {
        mapPtr = &mapDescending;
    } else {
        mapPtr = &mapAscending;
    }
}

评论

2赞 MSalters 10/6/2023
这可行,但性能是一个问题。 并且都与一条 CPU 指令有关。 贵了大约两个数量级。你为每一次比较付出代价。最好将 封装在两个类中,共享一个基类接口。这样,每个操作的动态调度仅发生一次。int<intint>intstd::functionstd::map
2赞 Alan Birtles 10/6/2023
@MSalters或仅使用原始函数指针,则此处不需要无状态比较器的 std:: 函数