STL中的set::iterator为const_iterator

C++强制类型转换解决STL set迭代器修改问题
本文讨论在C++中使用STL set时遇到的迭代器限制问题,即不能直接修改set元素。通过使用const_cast强制类型转换,可以将const_iterator映射成普通迭代器,从而实现元素的修改。文章提供了有效的解决方案,帮助开发者避免低效的erase和insert操作。

STL中的set::iterator为const_iterator
coding的时候遇到要修改stl set元素的问题,开始的时候编译始终通不过,后来参考:
http://blog.youkuaiyun.com/bichenggui/archive/2009/10/20/4705517.aspx
set的迭代器it有const修饰符,那么对它元素的修改就必然不能成功了
这个问题一般的解决方法是先erase这个元素,然后再insert,这样效率很低,所以得找更有效的方法
可以利用const_cast<type_t &>(*it)把it映射成一个引用的对象,那么就可以对它进行修改了
更多c++  强制类型转换的内容可以参考

// 按车道序列号排序 (lane_seq从左到右递增) std::sort(section_lanes.begin(), section_lanes.end(), [](ConstLaneInfo a, ConstLaneInfo b) { return a->lane_seq < b->lane_seq; }); /usr/include/c++/9/bits/stl_algo.h:1973:25: required from ‘void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)> >]’ /usr/include/c++/9/bits/stl_algo.h:4905:18: required from ‘void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)>]’ modules/perception/env/src/lib/sd_navigation/SdNavigationHighway.cpp:1974:16: required from here /usr/include/c++/9/bits/stl_heap.h:225:29: error: assignment of read-only location ‘__first.__gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >::operator+(__holeIndex).__gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >::operator*()’ 225 | *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __secondChild)); | ^ /usr/include/c++/9/bits/stl_heap.h:231:29: error: assignment of read-only location ‘__first.__gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >::operator+(__holeIndex).__gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >::operator*()’ 231 | *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first | ^ In file included from /usr/include/c++/9/bits/stl_tree.h:63, from /usr/include/c++/9/map:60, from modules/perception/env/src/lib/sd_navigation/SdNavigationHighway.h:4, from modules/perception/env/src/lib/sd_navigation/SdNavigationHighway.cpp:1: /usr/include/c++/9/bits/stl_algobase.h: In instantiation of ‘_BI2 std::__copy_move_backward_a(_BI1, _BI1, _BI2) [with bool _IsMove = true; _BI1 = const cem::message::env_model::LaneInfo* const*; _BI2 = const cem::message::env_model::LaneInfo* const*]’: /usr/include/c++/9/bits/stl_algobase.h:617:5: required from ‘_BI2 std::__copy_move_backward_a2(_BI1, _BI1, _BI2) [with bool _IsMove = true; _BI1 = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _BI2 = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >]’ /usr/include/c++/9/bits/stl_algobase.h:686:48: required from ‘_BI2 std::move_backward(_BI1, _BI1, _BI2) [with _BI1 = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _BI2 = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >]’ /usr/include/c++/9/bits/stl_algo.h:1856:8: required from ‘void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)> >]’ /usr/include/c++/9/bits/stl_algo.h:1890:25: required from ‘void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)> >]’ /usr/include/c++/9/bits/stl_algo.h:1976:31: required from ‘void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)> >]’ /usr/include/c++/9/bits/stl_algo.h:4905:18: required from ‘void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)>]’ modules/perception/env/src/lib/sd_navigation/SdNavigationHighway.cpp:1974:16: required from here /usr/include/c++/9/bits/stl_algobase.h:606:37: error: no matching function for call to ‘std::__copy_move_backward<true, true, std::random_access_iterator_tag>::__copy_move_b(const cem::message::env_model::LaneInfo* const*&, const cem::message::env_model::LaneInfo* const*&, const cem::message::env_model::LaneInfo* const*&)’ 605 | return std::__copy_move_backward<_IsMove, __simple, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 606 | _Category>::__copy_move_b(__first, | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ 607 | __last, | ~~~~~~~ 608 | __result); | ~~~~~~~~~ /usr/include/c++/9/bits/stl_algobase.h:577:2: note: candidate: ‘template<class _Tp> static _Tp* std::__copy_move_backward<_IsMove, true, std::random_access_iterator_tag>::__copy_move_b(const _Tp*, const _Tp*, _Tp*) [with _Tp = _Tp; bool _IsMove = true]’ 577 | __copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result) | ^~~~~~~~~~~~~ /usr/include/c++/9/bits/stl_algobase.h:577:2: note: template argument deduction/substitution failed: /usr/include/c++/9/bits/stl_algobase.h:606:37: note: deduced conflicting types for parameter ‘_Tp’ (const cem::message::env_model::LaneInfo*’ and ‘const cem::message::env_model::LaneInfo* const) 605 | return std::__copy_move_backward<_IsMove, __simple, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 606 | _Category>::__copy_move_b(__first, | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ 607 | __last, | ~~~~~~~ 608 | __result); | ~~~~~~~~~
最新发布
08-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值