【问题标题】:Appending Vectors附加向量
【发布时间】:2011-08-11 13:53:19
【问题描述】:

每个人都使用 C++ 练习 P6.07:编写一个函数 vector<int> append(vector<int> a, vector<int> b),在 a 之后附加 b

例如。 a is 1 4 9 16b is 9 7 4 9 11 然后返回 1 4 9 16 9 7 4 9 11

我的功能

vector<int> append(vector<int> a, vector<int> b)
{
    vector<int> appended;

    for (unsigned int i = 0; i < a.size(); i++)
    {
        appended.push_back(a[i]);
    }

    for (unsigned int i = 0; i < b.size(); i++)
    {
        appended.push_back(b[i]);
    }

    return appended;
}

我的一个尝试:

int main()
{
    cout << "Enter some numbers: ";
    int input, input2;
    vector<int> a, b;
    while (cin >> input)
    {
        if (cin.fail())
        {
            cout << "Enter some numbers: ";
            while (cin >> input2)
            {
                if (cin.fail()) {break;}
                else {b.push_back(input2);}
            }
        }
        else {a.push_back(input);}
    }
    return 0;
}

当我运行main() 函数时,如何使用cin 来获取向量ab

【问题讨论】:

  • 我不懂嵌套循环。并且while(cin &gt;&gt; input) 已经在提取失败时中断了循环:检查.fail() 是不必要的(在外循环的情况下,从不调用。)
  • 现在,它刚刚结束
  • 为什么把代码的相关部分删掉了,留下了和问题真的不相关的append函数?
  • 实际上,这只是我的猜测之一,但没有成功。我只需要知道如何使用cin 将值放入 2 个向量中,而这本书只展示了一个只有 1 个向量而不是 2 个向量的示例。我会把它放回去
  • 当我运行main() 函数时,如何使用cin 来获取向量ab

标签: c++ vector append std cin


【解决方案1】:

这不是一个答案,但我想指出一个有趣的事情:

while (cin >> input)
{
    if (cin.fail())
    //...
}

我在while 中看不到if 的任何意义。如果cin&gt;&gt;input 失败,循环将在执行if 之前中断。

这意味着,您的代码中的 while 块,简化为:

while (cin >> input)
{
    a.push_back(input);
}

这相当于你的while 块!

【讨论】:

  • @Tomalak:这是评论中的样子:0 否决票这不是答案,但我想指出一个有趣的事情:while (cin >> input ) { if (cin.fail()) //... } 在此期间我看不到 if 的任何意义。如果 cin>>input 失败,循环将在执行 if 之前中断。这意味着,代码中的 while 块简化为: while (cin >> input) { a.push_back(input); } 这相当于你的 while 块!
  • @Nawaz:我在问题评论中说了几乎相同的话,看起来不错。
  • @Tomalak:我觉得不太好。代码应该看起来很清晰。而在 cmets 中则不然。
  • @Tomalak:如果你的意思是this kind of formatting,那么一两个字就可以了,否则代码多了就​​很烦。
  • @Nawaz:当然,在我的评论中,相同信息只有几个标记。
【解决方案2】:

std::cin失败后,如果你想再次使用它,你需要清除它的错误标志。

至于追加,为什么不保留和插入呢?

void append(std::vector<int>& a, const std::vector<int>& b)
{
    a.reserve(a.size() + b.size());
    a.insert(a.end(), b.begin(), b.end());
}

【讨论】:

  • 我有一半希望insert 智能地为新数据保留足够的新空间,因为它从一开始就知道它需要多少。因此,我会说 pre-reserveing 是一个过早的优化。并不是说它很痛。
  • @Tomalak 你错了,因为vector&lt;&gt;::insert() 没有办法知道它要插入多少元素而不先计算它们。并且因为insert() 采用一对输入迭代器,所以它被限制在一次传递中,因此它在迭代输入范围时进行分配。这可能会触发重新分配。
  • @wilhelmtell:好吧,它可以查看迭代器的类别,如果它们是随机访问的(它们用于向量)则进行优化
  • @Itjax 但不是必须的。
  • @Tomalak:我被激怒了,所以我检查了 GCC vector::_M_range_insert。它不仅针对随机访问执行此优化,还针对所有前向迭代器执行此优化。
【解决方案3】:

你问了两个问题:如何附加两个向量,以及如何输入两组数字。

至于第一个,我会像其他人描述的那样使用std::vector::insert。至于第二种,我有两种选择。

您可以使用标记值(-1,例如,如果你们所有其他数字都是正数)来指示第一个列表的结尾。如果这不是一个选项,您可以在一行而不是从多行中读取第一组数字。

这里有两个程序可以做你想做的事情。

首先,一个使用 -1 作为标记值的程序:

#include <iostream>
using std::cin;
using std::cout;

#include <iterator>
using std::ostream_iterator;

#include <vector>
using std::vector;


int main()
{
    int i;
    vector<int> v1;
    while(cin >> i) {
        if(i == -1)
            break;
        v1.push_back(i);
    }
    vector<int> v2;
    while(cin >> i)
        v2.push_back(i);

    v1.insert(v1.end(), v2.begin(), v2.end());

    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, ", "));
} 

接下来,一个程序从单行读取第一组数字,从下一行读取第二组数字:

#include <iostream>
using std::cin;
using std::cout;
using std::getline;
using std::ostream;
using std::istream;

#include <sstream>
using std::stringstream;

#include <iterator>
using std::ostream_iterator;

#include <vector>
using std::vector;

#include <string>
using std::string;


vector<int>
fetch(ostream& os, istream& is)
{       
    vector<int> result;
    os << "Enter several values, all one one line:\n";
    string line;
    getline(is, line);
    stringstream sline(line);
    int i;
    while(sline >> i)
        result.push_back(i);
    return result;
}

int main()
{
    vector<int> v1(fetch(cout, cin));
    vector<int> v2(fetch(cout, cin));

    v1.insert(v1.end(), v2.begin(), v2.end());
    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, ", "));
    cout << "\n";
}

【讨论】:

  • 我已经有了附加 2 个向量的函数,但我遇到的问题是使用 cin 将值输入到向量 ab 中,我已经尝试过你的使用 2 个单独的 while 循环的方式,它只是在输入第一个向量的数字后终止
  • 另外,我距离流还有 2 章
  • 在我的两个单独的 while 循环中,不要在第一个循环后输入 EOF(CTRL-Z 或 CTRL-D)。而是输入“-1”。然后输入您的第二个列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2014-08-19
  • 2021-06-24
  • 1970-01-01
  • 2021-01-13
  • 2015-05-13
相关资源
最近更新 更多