在c ++ +链表中同时迭代多个链表

时间:2014-05-03 04:59:00

标签: c++ list

我正在执行一项任务,需要从包含多个char链接列表的链表计算度量(每行是一个链表,如图所示)。所以我需要遍历包含第二行空间的每个节点,以检查其他四个空格(顶部,底部,左侧,右侧)周围有多少个空格。例如,参考下图,第三行中的第二个空格周围有四个空格,因此计数++。 (“H”只是意味着非空间角色,抱歉我没有足够的声誉来发布真实的图片)。

我被允许使用STL链表库。我试图使用三个迭代器同时迭代三行。但是,代码变得非常混乱,甚至无法正常工作,因为每行的长度不同。我一直在考虑解决方案两天,但由于我已经练习C ++只有两个月了,所以我能想到的是相当有限的。所以我想知道是否有人能给我一个提示或更聪明的解决方案。

空间|空间| --H - | --H - | - H - | NULL | NULL

--- H - | --H --- |空间|空间| --- H- | - H - | NULL

--- H - |空间|空间|空间| - H-- |空间| NULL

空间| --H - |空间|空间| - H - | NULL | NULL

2 个答案:

答案 0 :(得分:0)

以下可能有所帮助:(在C ++ 11中):Live example

std::size_t countSpaceSurroundBySpace(const std::list<std::list<char>>& l)
{
    if (l.size() < 3u) {
        return 0u;
    }
    auto it1 = l.begin();
    auto it2 = std::next(it1);
    auto it3 = std::next(it2);
    std::size_t count = 0u;

    for (; it3 != l.end(); ++it1, ++it2, ++it3) {
        // pointers on the 5 characters
        std::list<char>::const_iterator its[5] = {
            it1->begin(),
            it2->begin(),
            it2->begin(),
            it2->begin(),
            it3->begin()
        };
        if (its[0] == it1->end()) { continue; }
        ++its[0];
        if (its[2] == it2->end()) { continue; }
        ++its[2];
        ++its[3];
        if (its[3] == it2->end()) { continue; }
        ++its[3];
        if (its[4] == it3->end()) { continue; }
        ++its[4];
        for (; its[0] != it1->end() && its[3] != it2->end() && its[4] != it3->end();) {
            if (std::all_of(std::begin(its), std::end(its), [](std::list<char>::const_iterator it) { return *it == ' '; })) {
                ++count;
            }
            for (auto& it : its) {
                ++it;
            }
        }
    }
    return count;
}

答案 1 :(得分:0)

您可以std::vector使用std::list::iterator。如果iterator尚未位于相应的list end(),那么您将拥有一个内循环,只需在每一步执行您想要的任何计算。如果您的传入list依次作为数组或vector提供,则会更容易。