您好我还是C ++的新手,我正在编写一个程序来反转向量中的元素。运行程序时没有任何错误,但是当我运行它并输入数字时,我的程序打印出“Printing ... end of print”,然后它就会自行关闭。我确定这可能是一个简单的错误。
using namespace std;
vector<int> reverse_a(const vector<int>&veca)
{
vector<int> vecb;
//size_t as the index type
size_t i = veca.size();
while ( i > 0 )
vecb.push_back(veca[--i]);
return vecb;
}
void print(const vector<int> vec)
{
cout << "printing " << endl;
for (size_t i = 0; i < vec.size(); ++i)
cout << vec[i] << ",";
cout << "\n" << "\n end of print.\n";
}
int main(void)
{
vector<int>veca;
vector<int>vecb;
int input;
while(cin >> input)
veca.push_back(input);
reverse_a(veca);
print(vecb);
}
答案 0 :(得分:2)
关于主题的排序,但无法在评论中解释。 Aderis的答案是正确的,πάνταῥεῖ为OP提供了另一种选择。
与编程问题的大多数介绍一样,标准库已经完成了所有工作。不需要任何功能,因为它已经存在,有点扭曲的形式:
std::copy(veca.rbegin(), veca.rend(), std::back_inserter(vecb));
std::copy
就像听起来那样:它复制了。您可以指定从哪里开始,停止的位置以及放置结果的位置。
在这种情况下,我们希望从veca
进行复制,但我们希望向后复制,因此我们不会像通常那样调用begin
,而是调用rbegin
来获取其中一个反向迭代器thingysπάνταῥεῖ正在谈论。为了定义结束,我们使用rend
,而不是从肢体上撕下肢体标记veca反向范围的结束。通常情况下,这是一个开头之前的veca[-1]
,如果存在这样的话。
std::back_inserter
告诉std::copy
如何将veca
中的数据放在vecb
的后面。
有人可能想跳过所有这些反向废话和
std::copy(veca.begin(), veca.end(), std::front_inserter(vecb));
但没有。首先,它会非常缓慢。考虑veca = {1,2,3,4,5}
。您将在vecb
的开头插入1,然后将其复制到第二个插槽以为2腾出空间。然后将每个插槽移动2和1以适合3。您将获得良好的反向排序但洗牌将是杀气腾腾的。你无法做到的第二个原因是因为vector没有实现使这项工作所需的push_front
函数,因为它会非常慢。
警告:
这种方法很简单,但速度很慢。 back_inserter可能会强制调整向量的内部数组的大小,但可以通过预先分配vecb
的存储来减轻这种情况。
答案 1 :(得分:1)
这只是一个简单的错误。您忘记将vecb
设置为reverse_a
中main
函数的结果。您应该reverse_a(veca);
而不是vecb = reverse_a(veca);
。你现在的方式,vecb
永远不会被设置,因此长度为零,没有任何打印。