0

来自 C++ 的练习 P6.07 适合所有人:编写一个在后面vector<int> append(vector<int> a, vector<int> b)追加的函数ba

前任。a is 1 4 9 16然后b 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;
}

我将如何使用cin来获取向量a以及b何时运行该main()函数?

4

3 回答 3

3

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());
}
于 2011-04-23T18:12:44.377 回答
1

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

至于第一个,我会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";
}
于 2011-04-23T22:28:34.420 回答
0

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

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

我看不出if里面有什么意义while。如果cin>>input失败,循环将在执行之前中断if

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

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

这相当于你的while块!

于 2011-04-23T18:12:39.920 回答