Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我想写一个遍历列表的函数?_C++_List - Fatal编程技术网

C++ 我想写一个遍历列表的函数?

C++ 我想写一个遍历列表的函数?,c++,list,C++,List,我想写一个函数,它遍历一个列表,但是如果两个元素等于一个目标,那么它将接受两个元素 逻辑可以是有两个循环;首先遍历列表,查看是否有任何元素+第一个=目标,然后是第二个,然后是第三个 等等 inti; int max=list.size; 对于(i=0;i,如果您的想法稍有不同,可能会有所帮助。您说的是“首先遍历列表,看看是否有任何元素+第一个=目标”。如果您将其表述为“遍历列表,看看当前元素+列表中的任何其他元素=目标”,该怎么办?我所做的就是合并您对“第一个,然后第二个,然后第三个等等”进入“

我想写一个函数,它遍历一个列表,但是如果两个元素等于一个目标,那么它将接受两个元素

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

inti;
int max=list.size;

对于(i=0;i,如果您的想法稍有不同,可能会有所帮助。您说的是“首先遍历列表,看看是否有任何元素+第一个=目标”。如果您将其表述为“遍历列表,看看当前元素+列表中的任何其他元素=目标”,该怎么办?我所做的就是合并您对“第一个,然后第二个,然后第三个等等”进入“当前元素”

你最初的措辞建议只有一个循环,用一些魔法来获得第一个元素,然后是第二个元素,等等。这个相反的措辞建议两个循环:一个用于获得每个元素,然后一个内部循环用于测试当前元素和列表中的每个其他元素。希望这种思维方式能够消除任何混淆

编辑:

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

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++引用,或查找文档,查找所使用的特定容器类型,并确定从中迭代元素的最佳方式。

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


感谢更新的问题。正如@leetNightshade在评论中指出的,我在这里看到的唯一问题是,内部循环应该从
curr+1
(或者
curr
,如果您想允许对元素本身进行测试,您可能不需要),并且您的循环应该在
curr
i
。否则,您将在循环中的列表末尾包含一个元素,这将产生恶劣的后果。

好的,这个问题令人困惑/奇怪,但我还有一些工作要做。这有点奇怪,请耐心听我说

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;
}
模板
V添加(常数V v1,常数V v2)
{
返回v1+v2;
}
模板
bool FINDTWOWEQUALTARGET(常数T和列表、常数V目标、V和elem1、V和elem2、V(*过程)(常数V v1、常数V v2)=添加)
{
对于(T::const_迭代器iter=list.begin();iter!=list.end();)
{
常数迭代器iter2=iter;
iter=iter2++;
对于(;iter2!=list.end();++iter2)
{
if(target==过程((*iter),(*iter2)))
{
elem1=(*iter);
elem2=(*iter2);
返回true;
}
}
}
返回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);
list iList=list();
iList.推回(5);
iList.推回(6);
iList.推回(1);
iList.向后推(4);
iList.向后推(3);
iList.推回(9);
int val1;
int val2;
FindWoeQualTarget(iList,11,val1,val2);

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

如果这是家庭作业,请为它添加一个标记。
std::list
?它排序了吗?列表被传递了,在这种情况下,我称它为list。你需要做很多循环to使此算法正常工作。从索引0开始,尝试将列表中的所有其他元素添加到该索引中以获得目标,然后移动到1并尝试在其之后添加所有其他元素以获得目标,然后移动到索引2并尝试在其之后添加所有其他元素以获得目标,等等。您真的需要这样做吗?您可以说明原始数据吗l问题?那么,你将有一个外循环,内循环另一个。@user570098:你的变量名为
list
,这一事实并不能告诉我们它是什么类型的,所以我不明白你怎么能得到任何合理的答案。就这一点而言,我仍然不明白你的问题是什么。我该怎么做?我补充了请允许我对我的答案进行更多的解释。请记住,为你做家庭作业并不存在SO。当我们看到你在解决问题上付出了多少努力时,我们的反应也会更好。如果你仍然有困难,请用你到目前为止所拥有的内容编辑你的原始问题,我们将能够更好地帮助你。@Daniel Gallagher哦,我应该不这样做吗那么,你打算发布代码吗?@leetNightshade:不同的人对家庭作业问题有不同的想法。我在这里看到的大多数人都不鼓励直接解决问题,而是选择发布提示并将海报指向正确的方向。也请查看此(或)丹尼尔·加拉赫(Daniel Gallagher)也从未说过这是为了家庭作业,所以你怎么能确定这是真的?是他拒绝告诉我们暗示了你吗?
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);