0

所以我想简化这个片段

#include <bits/stdc++.h>

using namespace std;

int n;
vector<int> A;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n;
    for (int i = 0; i < n; i++) {
        int tmp;
        cin >> tmp;
        A.push_back(tmp);
    }
}

而且因为我最近阅读了有关 inserters 和 back_inserters 的内容,所以我想立即使用它们,这就是我想出的

#include <bits/stdc++.h>

using namespace std;

int n;
vector<int> A;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n;
    for (int i = 0; i < n; i++) cin >> *back_inserter(A);
}

但是由于某种原因,编译器会吐出一条巨大的错误消息,我不能在这里放,所以这里只是第一句话,因为我认为它是最相关的。

error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'std::back_insert_iterator<std::vector<int> >')

谢谢你的帮助!

注意:在任何人评论全局变量的使用和 using 命名空间行之前,此代码仅用于竞争性编程。

4

2 回答 2

3

在这种情况下,您只是从输入流中读取空格分隔的值直到它结束,您可以使用std::copy从流中获取值。那看起来像

std::copy(std::istream_iterator<int>(cin),
          std::istream_iterator<int>(),
          std::back_inserter(vector_name));
于 2020-11-30T20:26:13.453 回答
0

你可以读入一个临时变量。

for (int k, i = 0; i < n; i++) cin >> k, back_inserter(A) = k;
# or nicer:
for (int i = 0; i < n; i++) {
     int k;
     cin >> k;
     back_inserter(A) = k;
}

您可以提供缺少的重载并读入其中的临时变量:

template<typename T>
std::istream& operator>>(std::istream& is, std::back_insert_iterator<std::vector<T>> obj) {
    T tmp;
    is >> tmp;
    obj = tmp;
    return is;
}

int main() {
    for (int i = 0; i < n; i++) cin >> back_inserter(A);
}
于 2020-11-30T20:41:54.203 回答