gpt4 book ai didi

c++ - 推进标准 map 的迭代器

转载 作者:太空狗 更新时间:2023-10-29 19:40:30 24 4
gpt4 key购买 nike

主要问题已经在标题中:How do I advance the iterator of a standard map?

但由于大多数人问我为什么需要这个,我将提供更多信息:我有一个类,里面有几张 map 。我至少有 2 个微分方程、至少 2 种传感器类型(场或 dft)和至少 2 种空间类型(体积、表面)。我需要保存所有这些东西,并在它们之间建立关联。所以我认为拥有这些东西的 map 是明智的,当这些东西相互关联时,它们在 map 中具有相同的键。

为简单起见,我们只考虑三个 map 。

class Reader
{
struct MaxwellSensor
{
// some members...
};
struct FieldSensor
{
// some members
uint fieldMember;
};
struct DFTSensor
{
// some members
uint dftMember;
};
std::map<uint, MaxwellSensor> maxwellSensors;
std::map<uint, FieldSensor> fieldSensors;
std::map<uint, DFTSensor> dftSensors;

uint getCountOfMaxwellSensors(){
return maxwellSensors.size();
}

uint getMemberForMaxwellSensorByIndex(uint index){
// This follows later
}

};

在我的编程过程中,我需要实例化SensorInterface 的几个变量。为此,我需要知道我有多少个 maxwell 传感器,然后遍历 maxwell 传感器并获取其他传感器的成员。

这看起来像:

class MyType{
public:
uint member;
}

int main(int argc, const char* argv[])
{
// some code
Reader myReader;
for(uint i = 0; i < myReader.countOfMaxwellSensors(); ++i)
{
MyType var;
var.member = myReader.getMemberForMaxwellSensorByIndex(i);
}
}

所以阅读器中的函数应该是这样的:

uint getMemberForMaxwellSensorByIndex(uint index)
{
auto maxIt = std::advance(maxwellSensors.begin(), index);
auto foundInFieldSensorsIt = std::find_if(fieldSensors.begin(), fieldSensors.end(), [&] (const std::pair<UInteger_T, FieldSensor>& kvp) { return kvp.first == maxIt->first; });
auto foundInDFTSensorsIt = std::find_if(dftSensors.begin(), dftSensors.end(), [&] (const std::pair<UInteger_T, DFTSensor>& kvp) { return kvp.first == maxIt->first; });
if(foundInFieldSensorsIt != fieldSensors.end())
return fieldSensors[maxIt->first].fieldMember;
else if(foundInDFTSensorsIt != dftSensors.end())
return dftSensors[maxIt->first].fieldMember;
else
{
std::cerr << "something went wrong." << std::endl;
return 0;
}
}

所以...这是 std::advance(maxwellSensors.begin(), index); 的意图,但是编译时不会出现以下错误代码:

error: 
no matching function for call to 'advance'
auto maxIt = std::advance(maxwellSensors.begin(), index);
^~~~~~~~~~~~
/c++/4.6/bits/stl_iterator_base_funcs.h:171:5: note:
candidate function [with _InputIterator = std::_Rb_tree_iterator<std::pair<const
unsigned int, Reader<double, unsigned int>::MaxwellSensor> >,
_Distance = unsigned int] not viable: expects an l-value for 1st argument
advance(_InputIterator& __i, _Distance __n)

那么如何推进标准 map 的迭代器呢?

我也试过 auto maxIt = maxwellSensors.begin() + index; 但没有成功。

并且:我想避免这样的 for 循环:

auto maxIt = maxwellSensors.begin();
for(uint i = 0; i < index; ++i){
++maxIt;
}

还有其他可能吗?非常感谢!

最佳答案

std::mapiterator_category双向迭代器iterator_category。这意味着不存在 O(1) 多步增量,例如随机访问迭代器。对于后者,你可以这样写:

auto it = my_vector.begin(); // std::vector has random access iterators
std::advance(it, 4); // NOT a loop, will call it += 4;
it += 4; // shorthand, not recommended in generic code

对于前者,你有

auto it = my_map.begin();    // std::map has bidirectional iterators
std::advance(it, 4); // for (auto i = 0; i < 4; ++i) ++it;

注意 std::advancevoid 返回类型。如果要返回高级迭代器,可以使用 std::next

auto it = my_map.begin();
auto it4 = std::next(it, 4); // copies it, then advances and returns that copy

std::advance 的 step 参数可以是负数,在这种情况下它将在幕后调用 --it。如果要返回递减的迭代器,可以使用 std::prev

关于c++ - 推进标准 map 的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21625629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com