提问人:seacat 提问时间:10/5/2023 最后编辑:seacat 更新时间:10/6/2023 访问量:124
如何在 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++
问:
我想使用指向 和 的指针。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);
}
答:
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<int
int>int
std::function
std::map
2赞
Alan Birtles
10/6/2023
@MSalters或仅使用原始函数指针,则此处不需要无状态比较器的 std:: 函数
评论
map<int,int>
并且是不同的类型......您可以使用,但我不推荐它(并且可能不适用于您要做的任何事情)。也许你应该描述你正在尝试做什么/解决什么,然后更容易提供一个更有用的答案。map<int,int,greater<>>
void *
std::variant