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

问题描述 投票:0回答:2

我想使用一个同时指向

map<int,order>
map<int,order,greater<>>
的指针。

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

这样做的原因是,我需要更新基于升序或降序的地图。除了迭代顺序外,所有更新操作都是相同的。更新操作是累加的。

那么,如何做到这一点?

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++ pointers templates instantiation
2个回答
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);
    }
}

0
投票

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

#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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.