我对编程非常陌生,并且正在研究C ++ Primer 5th版本。其中一个练习要求我在向量中输入一组整数,并打印第一个和最后一个元素的总和,然后打印第二个和倒数第二个等。
我尝试了多种方法,这些方法是我在GitHub上找到的,以及其他与遍历向量相关的问题的答案...但是没有一种有效。 这是我最近的尝试:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> Vect;
int Num;
while (std::cin >> Num) {
Vect.push_back(Num);
for (decltype(Vect.size()) A = 0, B = Vect.size() -1 ; A != B; ++A, --B) {
std::cout << Vect[A] + Vect[B] << std::endl;
}
}
return 0;
}
任何提示或想法将不胜感激。谢谢!
答案 0 :(得分:5)
您处在正确的轨道上,只需确保在对输入进行任何处理之前先阅读输入。 基本上,将元素求和的部分应该在while循环之外以读取输入。
答案 1 :(得分:2)
您的意思是这样的吗?
std::vector<int> a(100), res;
std::iota(a.begin(), a.end(), 1);
std::transform(
a.begin(), a.begin()+a.size()/2, a.rbegin(),
std::back_inserter(res), std::plus<int>());
答案 2 :(得分:1)
您应该了解为什么代码崩溃?
您要求编译器同时输入元素并执行一些逻辑,在这种情况下,您输入数字,然后检查向量大小,然后执行逻辑,即打印第一个和最后一个然后是A ++和B-的总和-获得第二个倒数第二个。
让我们调试一下以了解更多信息
假设您已编译并且输入的第一个输入为5,这意味着您现在拥有一个元素{5}
插入数字后,编译器将转到下一行以继续逻辑,然后将找到条件A != B
,并且您拥有一个元素{5}
,这意味着A = B,因此编译器将不会进入循环运行逻辑
然后第二个输入为5,这意味着您现在有两个元素{5,5}
插入数字后,编译器将转到下一行以继续逻辑,然后将找到条件A != B
,并且您有一个元素{5,5}
,这意味着A!= B,因此编译器将进入循环以运行逻辑。
编译器将求和向量5 + 5中的第一个和最后一个(向量中仅2个元素,A = vect [0],B = vect [1]),并打印结果10,然后将A ++和B-,A将是A = vec [1],B将是B = vect [0],结果也将是10,然后A ++和B-- >> 编译器将找不到带有vect [-1]或vect [2]的任何元素,因此,应用程序将崩溃。
学习课程
如果您在输入过程中无需执行任何逻辑,则将您的输入与代码逻辑分开。
您应该将for循环置于while循环之外。
更新:您的代码应类似于
#include<iostream>
#include<vector>
using namespace std;
int main ()
{
vector<int> Vect;
int Num;
while (cin >> Num) {
Vect.push_back(Num);
}
for (decltype(Vect.size()) A = 0, B = Vect.size() -1 ; A < B; ++A, --B) {
cout << Vect[A] + Vect[B] << std::endl;
}
return 0;
}
您会看到我也将条件A != B
更改为A < B
,因为您的条件将使A
永远增加,而B
将永远减少并导致您的应用程序崩溃
另外,不要忘记限制输入,不要进入无限循环输入 限制输入“我输入4个数字作为示例”后,请参见以下代码
#include<iostream>
#include<vector>
using namespace std;
int main ()
{
vector<int> Vect;
int Num,c=0;
while (c<4) {
cin >> Num;
Vect.push_back(Num);
c++;
}
for (decltype(Vect.size()) A = 0, B = Vect.size() -1 ; A < B; ++A, --B) {
cout << Vect[A] + Vect[B] << std::endl;
}
return 0;
}
答案 3 :(得分:0)
采用a[N]
数组的c ++数组方法:
int i, j;
for (i = 0, j = N - 1; i <= j; ++i, --j){
cout<<a[i] + a[j]<<endl;
}