...
// 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。
我曾尝试向迭代器添加另一个增量,但是在运行时收到错误消息“无法增量终止列表迭代器”。
编辑,感谢大家的评论,非常感谢,显然我还有很多东西要学习。
答案 0 :(得分:0)
根据cpp reference文档,插入函数
在pos之前插入值
因此,当您listint.insert(it, val);
执行此操作时,请在迭代器val
的位置之前插入it
。因此1,3,2,5变为1²,1,3²,3,2²,2,5²,5 = 1,1,9,3,4,2,25,5。
如果您增加运算符,则需要确保您未尝试访问listint.end()
,因为根据documentation
std :: list :: end
将迭代器返回到容器最后一个元素之后的元素。
此元素充当占位符; 尝试访问它会导致未定义的行为。
正如其他人指出的那样,如果您只想获取原始数字的平方,而无需插入新值,则只需在迭代器中修改该值即可。
答案 1 :(得分:0)
只需使用std :: pair的向量/列表来存储结果。 pair.first保存您的基本值,pair.second保存结果。因此,您无需在迭代时修改商品计数。
答案 2 :(得分:0)
您无需在列表中再次插入元素。只需将变量作为参考并对其进行修改。好吧,您代码的问题在于插入函数。
插入功能会在给定位置之前插入。就像您给出第4个位置一样,它将插入第4个位置之前。
从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 << ", ";
}
}
答案 3 :(得分:0)
您可以在循环内使用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
插入后需要更新,以免失效。
答案 4 :(得分:0)
我不知道您是否需要使用insert方法。 但是正如您在文档here中所看到的那样,它会插入您在第一个参数中指定的位置,从而将所有元素都向后推。
我建议一种简单的方法:
for (int j = 0; j < array1.size(); ++j)
{
listint.push_back(array1[j]);
listint.push_back(array1[j] * array1[j]);
}