谢谢lcoudy和各位,原因在于不能使用&m.begin();
之所以用C的方式,是因为客户要C的SDK,尽量兼容他们之前的函数原型。
我用下面的办法解决了,完整的程序也可以在附件中查看。
现在的问题是,想修改两处函数原型
1. get_headers想修改成 const list_t* get_headers(const struct Req* req);
2. get_header_first想修改成 void* get_header_first(const list_t* list, struct iterator_t* iter);
#include <stdio.h>
#include <iostream>
#include <unordered_map>
using namespace std;
typedef struct {
unordered_map<int, int>::iterator current_it;
unordered_map<int, int>* map_ptr;
} list_t;
struct iterator_t {
void* ptr_list;
};
struct Req {
unordered_map<int, int> headers;
list_t header_list;
Req() {
header_list.map_ptr = &headers;
}
void add_headers() {
headers.insert(make_pair(1, 1));
headers.insert(make_pair(2, 2));
}
};
list_t* get_headers(const struct Req* req) {
return const_cast<list_t*>(&req->header_list);
}
void* get_header_first(list_t* list, struct iterator_t* iter) {
list->current_it = list->map_ptr->begin();
iter->ptr_list = list;
return iter;
}
void get_header_item(const struct iterator_t* iter, int& a, int& b) {
list_t* list = (list_t*)iter->ptr_list;
a = list->current_it->first;
b = list->current_it->second;
}
void* get_header_next(struct iterator_t* iter) {
list_t* list = (list_t*)iter->ptr_list;
list->current_it = std::next(list->current_it);
return iter;
}
int main() {
// add some test data
Req* req = new Req;
req->add_headers();
// test now
struct iterator_t iter;
int a = 0;
int b = 0;
const list_t* list = get_headers(req);
get_header_first(const_cast<list_t*>(list), &iter);
get_header_item(&iter, a, b);
cout << a << " " << b << endl;
get_header_next(&iter);
get_header_item(&iter, a, b);
cout << a << " " << b << endl;
return 0;
}
【 在 lcoudy 的大作中提到: 】
: 只看unordered_map的定义的话,我觉得这个应该是这样子的。
: iterator begin() noexcept;(since C++11)
: const_iterator begin() const noexcept;(since C++11)
: ...................
附件(1.5KB) visit-std-map-in-c.cpp--
FROM 117.100.99.*