不忍直视
【 在 casbupt (想不上班有钱赚) 的大作中提到: 】
: 标 题: Re: 主题:[求助]一个迭代器问题
: 发信站: 水木社区 (Tue Feb 11 15:14:32 2020), 站内
:
: 谢谢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)
: : ...................
: [upload=1][/upload]
: --
:
: ※ 来源:·水木社区
http://www.newsmth.net·[FROM: 117.100.99.*]
:
--
FROM 76.126.252.*