努力遍历列表

...
// ConsoleApplication2.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <vector>
#include <list>



void squareVector(std::vector<int>&array1) 
{
    std::list<int> listint;
    for (int j = 0; j < array1.size();++j) 
    {
        listint.push_back(array1[j]);
    }
    std::list<int>::iterator it;
    it = listint.begin();
    int val;

    for (std::list<int>::iterator i = listint.begin(); i != listint.end(); ++i) 
    {
    val = *i * *i;
    listint.insert(it,val);
    ++it;
    }
    for (std::list<int>::iterator i = listint.begin(); i != listint.end(); ++i) 
    {
        std::cout << *i << ",";    
    }
}

int main()
{
     std::vector<int>intlist ({ 1,3,2,5 });
    squareVector(intlist);
}

...

我的目标是将数字1、3、2和5放入列表中,然后对每个数字和平方进行平方运算,然后设法将它们平方并放入列表中,但是由于某种原因从前到后。 即输出应该是1,1,9,4,5,25,但是我得到的是1,25,5。

我曾尝试向迭代器添加另一个增量,但是在运行时收到错误消息“无法增量终止列表迭代器”。

编辑,感谢大家的评论,非常感谢,显然我还有很多东西要学习。

GoDolphinboy 回答:努力遍历列表

根据cpp reference文档,插入函数

  

在pos之前插入值

因此,当您listint.insert(it,val);执行此操作时,请在迭代器val的位置之前插入it。因此1,3,2,5变为1²,1,3²,3,2²,2,5²,5 = 1,1,9,4,25,5。

如果您增加运算符,则需要确保您未尝试访问listint.end(),因为根据documentation

  

std :: list :: end

     

将迭代器返回到容器最后一个元素之后的元素。

     

此元素充当占位符; 尝试访问它会导致未定义的行为。

正如其他人指出的那样,如果您只想获取原始数字的平方,而无需插入新值,则只需在迭代器中修改该值即可。

,

只需使用std :: pair的向量/列表来存储结果。 pair.first保存您的基本值,pair.second保存结果。因此,您无需在迭代时修改商品计数。

,

您无需在列表中再次插入元素。只需将变量作为参考并对其进行修改。好吧,您代码的问题在于插入函数。

  

插入功能会在给定位置之前插入。就像您给出第4个位置一样,它将插入第4个位置之前。

     

从cpp参考资料中阅读此摘录
  1. pos-插入内容的迭代器。 pos可能是end()迭代器。

因此,在执行时,您将在迭代器的位置指向之前插入。因此1,5变成1²,1,5²,5(在1之前,然后在3之前,依此类推)

如果将所有内容都保留在编译器上会更好吗?为此,请使用基于范围的循环。见下文。

void squareVector(std::vector<int>&array1)
{
    std::list<int> listint;
    for (int j = 0; j < array1.size();++j)
    {
        listint.push_back(array1[j]);
    }
    std::list<int>::iterator it;
    it = listint.begin();
    int val;

    for(auto &i : listint) // declare i as reference not as plain i.
        i = i*i;
    for (std::list<int>::iterator i = listint.begin(); i != listint.end(); ++i)
    {
        std::cout << *i << ",";
    }
}
,

您可以在循环内使用var boxers = await boxrec.getRatings(cookieJar,{ "division": "Heavyweight","sex": "M","status": "a" }); // I don't know what properties it has actually,but you get the point let saveString = JSON.stringify({ name: boxers.name,id: boxers.boxerId,weird: boxers.thing,list: boxers.getList().map(yay => yay.name),// [...] etc }); 本身,而不是使用单独的迭代器并单独对其进行递增。

i

for (std::list<int>::iterator i = listint.begin(); i != listint.end(); ++i) { val = *i * *i; i=listint.insert(std::next(i),val); // i points to the inserted element } 返回后继元素的迭代器。 std::next插入后需要更新,以免失效。

,

我不知道您是否需要使用insert方法。 但是正如您在文档here中所看到的那样,它会插入您在第一个参数中指定的位置,从而将所有元素都向后推。

我建议一种简单的方法:

for (int j = 0; j < array1.size(); ++j)
{
    listint.push_back(array1[j]);
    listint.push_back(array1[j] * array1[j]);
}
本文链接:https://www.f2er.com/3167728.html

大家都在问