有没有办法将 local_iterator 转换为 const_iterator 或迭代器?
Is there a way to convert local_iterator to const_iterator or iterator?
如何将unordered_multimap::local_iterator更改为unordered_multimap::iterator或unordered_multimap::const_iterator?
我需要更改,因为我们不能使用 local_iterator 擦除元素,只能使用 iterator/const_iterator 擦除元素。如果还有其他擦除方法local_iterator,请提出建议。
有点费力,但您可以遍历 equal_range()
的结果,直到找到正确的迭代器:
template<typename Cont>
typename Cont::iterator local_to_regular_iterator(Cont& c, typename Cont::local_iterator local_ite) {
auto range = c.equal_range(local_ite->first);
for(auto ite = range.first; ite != range.second; ++ite) {
if(&ite->second == &local_ite->second) {
return ite;
}
}
throw std::out_of_range("huh?");
}
据我所知,这已经是你目前能得到的最好的了。
您可以使用 find_if
算法来搜索具有相同地址的元素,如下所示:
auto it = std::ranges::find_if(m,
[ptr = std::addressof(*local_it)](const auto& e) -> bool
{
return ptr == std::addressof(e);
}
);
这是完整的代码片段:
#include <string_view>
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <ranges>
#include <memory>
int main()
{
std::unordered_multimap<int, char> m;
m.insert({1, 'a'});
m.insert({1, 'b'});
m.insert({2, 'c'});
auto local_it = m.begin(m.bucket(1));
std::cout << local_it->first << local_it->second << '\n';
auto it = std::ranges::find_if(m,
[ptr = std::addressof(*local_it)](const auto& e) -> bool
{
return ptr == std::addressof(e);
}
);
std::cout << it->first << it->second << '\n';
return 0;
}
运行它here.
如何将unordered_multimap::local_iterator更改为unordered_multimap::iterator或unordered_multimap::const_iterator? 我需要更改,因为我们不能使用 local_iterator 擦除元素,只能使用 iterator/const_iterator 擦除元素。如果还有其他擦除方法local_iterator,请提出建议。
有点费力,但您可以遍历 equal_range()
的结果,直到找到正确的迭代器:
template<typename Cont>
typename Cont::iterator local_to_regular_iterator(Cont& c, typename Cont::local_iterator local_ite) {
auto range = c.equal_range(local_ite->first);
for(auto ite = range.first; ite != range.second; ++ite) {
if(&ite->second == &local_ite->second) {
return ite;
}
}
throw std::out_of_range("huh?");
}
据我所知,这已经是你目前能得到的最好的了。
您可以使用 find_if
算法来搜索具有相同地址的元素,如下所示:
auto it = std::ranges::find_if(m,
[ptr = std::addressof(*local_it)](const auto& e) -> bool
{
return ptr == std::addressof(e);
}
);
这是完整的代码片段:
#include <string_view>
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <ranges>
#include <memory>
int main()
{
std::unordered_multimap<int, char> m;
m.insert({1, 'a'});
m.insert({1, 'b'});
m.insert({2, 'c'});
auto local_it = m.begin(m.bucket(1));
std::cout << local_it->first << local_it->second << '\n';
auto it = std::ranges::find_if(m,
[ptr = std::addressof(*local_it)](const auto& e) -> bool
{
return ptr == std::addressof(e);
}
);
std::cout << it->first << it->second << '\n';
return 0;
}
运行它here.