【问题标题】:I want to write a function that iterates through a list?我想编写一个遍历列表的函数?
【发布时间】:2011-03-31 06:47:30
【问题描述】:

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

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

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]);

        }
       }

}

我相信缺少一件事以确保它再次通过?

【问题讨论】:

  • 如果是作业,给它加个标签。
  • 那是std::list&lt;int&gt; 吗?排序了吗?
  • 传入列表,在这种情况下我称之为列表
  • 你将不得不做很多循环来让这个算法工作。从索引 0 开始并尝试将列表中的所有其他元素添加到它以获取目标,然后移至 1 并尝试在其后添加所有其他元素以获取目标,然后移至索引 2 并尝试添加所有其他元素之后获得目标等。你真的需要这样做吗?你能说出原来的问题吗?因此,您将有一个外部循环,内部还有另一个循环。
  • @user570098 :您的变量被命名为 list 的事实并没有告诉我们它是什么类型的任何信息,所以我不知道您如何获得任何合理的答案。就此而言,我仍然不明白你的问题是什么。

标签: c++ list


【解决方案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,如果你想允许对一个元素本身进行测试,你可能不这样做' t),并且您的循环应分别在 curr &lt; resistors.size()i &lt; max 时终止。否则,您将在循环中包含一个超出列表末尾的元素,这将产生令人讨厌的后果。

【讨论】:

  • 我该怎么做?
  • 我在回答中添加了更多解释。请记住,SO 不存在为您做功课。当我们看到您为解决问题付出了多少努力时,我们也会做出更好的反应。如果您仍然遇到问题,请根据您目前的情况编辑您的原始问题,我们将能够更好地为您提供帮助。
  • @Daniel Gallagher 哦,那我不应该尝试发布代码吗?
  • @leetNightshade:不同的人对作业问题有不同的想法。我在这里看到的大多数人都不鼓励直接解决问题,而是选择发布提示并将海报指向正确的方向。还可以在 meta 上查看 question(或 this one)。
  • @Daniel Gallagher 另外,他从来没有说过这是为了家庭作业,所以你怎么能确定它是?是他拒绝告诉我们暗示了你吗?
【解决方案2】:

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

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);

我知道您希望该函数返回一个列表,我现在正在玩一些东西以便为您轻松设置它,但我认为您现在可以解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2016-08-09
    • 2023-03-06
    • 2020-11-02
    • 2022-08-17
    • 2018-08-11
    • 1970-01-01
    相关资源
    最近更新 更多