首页 > 解决方案 > 努力遍历列表

问题描述

...
// 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,3,9,2,4,5,25,但我得到的是1,1,9,3,4,2,25,5。

我尝试向迭代器添加另一个增量,但在运行时出现错误“无法增加结束列表迭代器”。

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

标签: c++list

解决方案


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

Insert 函数在给定位置之前插入。就像你给第四个位置一样,它会在第四个位置之前插入。

从 cpp 参考 1 中阅读此摘录
。 pos - 将在其之前插入内容的迭代器。pos 可能是 end() 迭代器。

因此,当您执行时,您在迭代器的位置指向之前插入。因此 1,3,2,5 变为 1²,1,3²,3,2²,2,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 << ", ";
    }
}

推荐阅读