Как подключиться к back_inserter или любому устройству вставки в C++?

Итак, я подумал об упрощении этого фрагмента

#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);
    }
}

И поскольку я недавно прочитал о вставках и 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 namespace, этот код был предназначен для использования только в соревновательном программировании.

2 ответа

Решение

Вы можете читать во временную переменную.

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);
}

В этом случае, когда вы просто читаете значения, разделенные пробелами, из входного потока до его конца, вы можете использовать std::copy чтобы получить значения из потока. Это будет выглядеть как

std::copy(std::istream_iterator<int>(cin),
          std::istream_iterator<int>(),
          std::back_inserter(vector_name));
Другие вопросы по тегам