在OpenFOAM中,我可以访问我的模拟时间列表,如下所示:
const auto& tlist = mesh.time().times(); //or runTime.times();
把它放在一个自定义函数对象的上下文中,当你想要访问时间列表时。
当我打印列表时:
Foam::Info << tlist << Foam::endl;
然后通过postProcess
命令运行函数对象,我得到:
9
(
0 constant
0 0
0.001 0.001
0.002 0.002
0.003 0.003
0.004 0.004
0.005 0.005
0.006 0.006
0.007 0.007
)
End
我想从列表中去掉前两个元素,即(0 constant)
和(0 0)
。但是我找不到任何方法来做到这一点,所有我发现的是,如果对象是一个哈希表,那么有一个erase
方法,通过它的键删除元素。
我该如何从我的时间tlist
列表中删除前两个元素?或者至少我要如何把这个列表转换成另一个数据结构,让我可以这样做?
谢谢
编辑:
下面是OpenFOAM中List定义的链接:https://cpp.openfoam.org/v9/classFoam_1_1List.html
免责声明,我从未使用过OpenFOAM。看起来List
有迭代器。https://cpp.openfoam.org/v9/classFoam_1_1UList.html。因此,您可以尝试这样做(假设迭代器的工作方式与我习惯的其他库一样):
const auto& tlist = mesh.time().times(); //or runTime.times();
// assuming operator+ available on iterator. this will copy data
auto sublist = List<instant>(tlist.begin()+2,tlist.end());
Foam::Info << sublist << Foam::endl;
// or you could try to loop over the elements manually, this won't copy data
for (auto it = tlist.begin()+2; it != tlist.end(); ++it )
{
std::cout << *it << "n";
}
std::cout << std::endl;
比起使用迭代器,使用特定于openfoam的习惯用法更有意义。获取第一个列表,您可以使用SubList类获取原始列表的视图。在此基础上,您可以选择是使用SubList,还是将其深度复制到另一个列表中。
编辑(第一部分是从我的手机上草草写下来的):
下面是如何使用的一个简单示例子列表:
instantList allTimes(runTime.times());
Info<< "I have " << allTimes.size() << " times:" << nl
<< allTimes << nl;
if (allTimes.size() > 2)
{
SubList<instant> someTimes(allTimes, allTimes.size()-2, 2);
Info<< "Subset of times: " << someTimes << nl;
}
如果您考虑string::substr(),那么SubList
构造函数的参数顺序可能会有点混乱,但本质上是:
- 原始列表
- 子集大小
- 偏移量(缺失为0)
注意,这个SubList是一个非常轻量级的视图到现有列表中,您可以使用它来修改列表的子部分等。如果你有一个分支的情况,你可能想要统一地处理事情,你可以简单地加入一个三元制。例如,
const SubList<instant>& myTimes =
(
(allTimes.size() > 2)
? SubList<instant>(allTimes, allTimes.size()-2, 2)
: SubList<instant>(allTimes)
);
你也可以使用labelRange来选择东西。例如,
labelRange myslice(0, allTimes.size());
if (allTimes.size() > 2)
{
myslice.reset(2, allTimes.size()-2);
}
// Now
Info<< "Selected times: "
<< SubList<instant>(allTimes, myslice) << nl;
由于SubList也是列表的一种类型,因此可以对其使用range-for等。
请注意,在下一个版本(12月-2021年)中,您也可以直接获得视图。例如,
#if (OPENFOAM >= 2112)
Info<< "Selected times: " << allTimes.slice(2) << nl;
#endif