C ++向量中元素的反向序列

时间:2015-11-10 02:49:34

标签: c++ vector

您好我还是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);

}

2 个答案:

答案 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_amain函数的结果。您应该reverse_a(veca);而不是vecb = reverse_a(veca);。你现在的方式,vecb永远不会被设置,因此长度为零,没有任何打印。