【发布时间】:2014-03-04 17:45:16
【问题描述】:
主要问题已经在标题中了:如何推进标准地图的迭代器?
但由于大多数人问我为什么需要这个,我将提供更多信息: 我有一堂有几张地图的课。我至少有 2 个微分方程、至少 2 种传感器类型(场或 dft)和至少 2 种空间类型(体积、表面)。我需要保存所有这些东西,并在它们之间建立关联。 所以我认为拥有这些事物的映射是明智的,当事物相互关联时,它们在映射中具有相同的键。
为简单起见,我们只考虑三个地图。
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 的几个变量。
为此,我需要知道我有多少个麦克斯韦传感器,然后遍历麦克斯韦传感器并获取其他传感器的成员。
这看起来像:
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)
那么如何推进标准地图的迭代器呢?
我也试过auto maxIt = maxwellSensors.begin() + index;,但没有运气。
并且:我想避免这样的 for 循环:
auto maxIt = maxwellSensors.begin();
for(uint i = 0; i < index; ++i){
++maxIt;
}
还有其他可能吗? 非常感谢!
【问题讨论】:
-
您的问题并不完全有道理。您想通过
std::advance()电话获得什么?最后的迭代器?元素“索引”的迭代器?还有什么? -
你真的不应该在地图上使用
find_if,而应该使用map::find成员。否则,您首先会放弃使用map的所有好处。 -
基本上你需要阅读你在尝试使用
std::advance时得到的编译器错误信息。 -
该死!我没有只见树木不见森林。
expects an l-value for 1st argument应该告诉我一切...
标签: c++ iterator stdmap bidirectional stdadvance