配列のセットがあり、各配列 ( data[]
) が二重リンク リスト ノードに格納されていますArrayNode
。配列内の特定のインデックスから開始し、別の配列内の別のインデックスまで反復処理します (それらは同じ配列である可能性があります)。2 つのノードがリンクされており、最初のノードが 2 番目のノードの「左側」にあることは確かです。
struct ArrayNode
{
ArrayNode* prev;
ArrayNode* next;
int data[16];
unsigned int count;
};
void iterate(ArrayNode* startnode, unsigned int startposition, ArrayNode* endnode, unsigned int endposition)
{
for (unsigned int index = startposition; index < startnode->count; ++index)
{
std::cout << startnode->data[index] << "\n"; //I'd do some processing here
}
for (ArrayNode* node = startnode->next; node != endnode; node = node->next)
{
for (unsigned int index = 0; index < node->count; ++index)
{
std::cout << node->data[index] << "\n"; //I'd do some processing here
}
}
for (unsigned int index = 0; index < endposition; ++index)
{
std::cout << endnode->data[index] << "\n"; //I'd do some processing here
}
}
上記のコードにはいくつかの点で欠陥があります。まず第一に、 の場合startnode == endnode
、間違った出力が得られます。第 2 に、3 つのループを持つことは、メンテナンスとコード サイズの点で非効率的です。中央のネストされたループですべてのケースをエレガントに処理できるように思われますが、方法がわかりません。それは...ですか?そうでない場合、これはどのように行う必要がありますか?
可能であれば、このためのイテレータ オブジェクトを作成することは避けたいと思います。