我想写一个迭代列表的函数?

时间:2011-03-30 20:25:29

标签: c++ list

我想编写一个遍历列表的函数,但如果它们等于一个目标则需要两个元素。

逻辑可能是有两个循环;首先遍历列表并查看是否有任何元素+第一个=目标,然后是第二个,然后是第三个 等等。

int i;
int max = list.size;
for(i=0; i<=max; i++)
{
    if()
}

在c ++中

    int i;
int max = resistors.size();
int curr;
    for(curr = 0; curr<=resistors.size(); curr++)
    {
   for(i=1; i<=max; i++)
       {
        if((resistors[curr]+resistors[i])==target){
            ComposeSerial(resistors[curr], resistors[i]);

        }
       }

}

我相信还有一件事是为了确保它再次通过?

2 个答案:

答案 0 :(得分:1)

如果您稍微考虑一下它可能会有所帮助。你说“首先遍历列表并查看是否有任何元素+第一个=目标”。如果你把它称为“迭代列表并查看当前元素+列表中的任何其他元素=目标”,该怎么办?我所做的就是将“第一个,然后是第二个,然后是第三个......”的位置合并到“当前元素”中。

你原来的短语只表示一个循环,有一些魔法可以得到第一个元素,然后是第二个等等。这个反向措辞暗示了两个循环:一个得到每个元素,然后一个内部循环来测试当前元素列表中的其他元素。希望这种思维方式能够消除任何混乱。

修改

由于这并没有消除所有的困惑,我将添加一些伪代码:

for all items in list
    for all items in list
        if element from outer loop and element from inner loop meet your condition
             return some value

一个明显的优化是内循环从外循环中的元素开始,如下所示:

for all items in list
    for all items in list after the element from the outer loop
        ...

根据问题,您可能希望在内部循环的开头包含外部元素:

for all items in list
    for all items in list starting at the element from the outer loop

要编写实际代码,抓取您的教科书或最近的C ++参考,或转到cplusplus.com,查找您正在使用的特定容器类型的文档,并确定迭代的最佳方法你的元素来自那里。

编辑2 - 对编辑问题的回应

感谢您提供更新的问题。我在这里看到的唯一问题是,正如@leetNightshade在评论中指出的那样,内部循环应该从curr + 1(或curr开始,如果你想允许对自己的元素进行测试,你可能没有),你的循环应分别在curr < resistors.size()i < max时终止。否则,您将在循环中列出列表末尾之外的一个元素,这将产生令人讨厌的后果。

答案 1 :(得分:0)

好吧,这个问题是一个令人困惑/奇怪的问题,但我还有一些东西仍然在进行中。这有点奇怪,但请耐心等待。

template<typename V>
V Add(const V v1, const V v2)
{
    return v1 + v2;
}

template<class T,typename V>
bool FindTwoEqualTarget(const T& list, const V target, V& elem1, V& elem2, V (*Process)(const V v1, const V v2) = Add)
{
    for(T::const_iterator iter = list.begin(); iter != list.end(); )
    {
        T::const_iterator iter2 = iter;
        iter = iter2++;
        for( ; iter2 != list.end(); ++iter2)
        {
            if(target == Process((*iter),(*iter2)))
            {
                elem1 = (*iter);
                elem2 = (*iter2);
                return true;
            }
        }
    }

    return false;
}

你可以像这样使用它:

list<int> iList = list<int>();
iList.push_back(5);
iList.push_back(6);
iList.push_back(1);
iList.push_back(4);
iList.push_back(3);
iList.push_back(9);

int val1;
int val2;
FindTwoEqualTarget(iList, 11, val1, val2);

我知道你希望函数返回一个列表,我现在正在玩一些东西来轻松地为你设置这个,但是你现在可以解决这个问题了。