Как разделить два разных массива в одном цикле? - PullRequest
0 голосов
/ 18 октября 2019

Я хочу разделить таким образом a -> num и b -> num2 Но я не могу добавить другую часть переменной в цикл for, for (auto& i, i2 : arr, arr2)

Есть ли другие способы сделать это?

#include <charconv>

int64_t a = 123567893,
        b = 85162,
        test = 0,
        test2 = 0;

    string arr = to_string(a),
           arr2 = to_string(b),
           num,
           num2 ;

    for (auto& i : arr, arr2)
    {
        num.push_back(i);
        num2.push_back(i);
        cout << i;
        // cout << i2;
    }

    from_chars(num.data(), num.data() + num.size(), test);
    from_chars(num2.data(), num2.data() + num2.size(), test2);


    cout << "\n" << test << endl;
    cout << "\n" << test2 << endl;

Ответы [ 3 ]

1 голос
/ 18 октября 2019

Вы можете использовать повышение

#include <boost/range/combine.hpp>
#include <iostream>
#include <vector>

using namespace std;

int main() {
    std::string arr = "ABC";
    std::string arr2 = "XYZ";
    std::string num, num2;
    assert(arr.size() == arr2.size());
    for (const auto &i : boost::combine(arr, arr2)) {
        decltype(arr)::value_type a;
        decltype(arr2)::value_type b;
        boost::tie(a, b) = i;
        num.push_back(a);
        num2.push_back(b);
        cout << a;
        cout << b;
    }
}

Вывод

AXBYCZ

Я не знаю, есть ли решение для основанного на диапазоне для циклов без повышения. Конечно, вы могли бы

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int main() {
    std::string arr = "ABC";
    std::string arr2 = "XYZ";
    std::string num, num2;
    for (unsigned int i{0}; i < std::max(arr.size(), arr2.size()); ++i) {
        if (i < arr.size()) num.push_back(arr[i]);
        if (i < arr2.size()) num2.push_back(arr2[i]);
        if (i < arr.size()) cout << arr[i];
        if (i < arr2.size()) cout << arr2[i];
    }
}
0 голосов
/ 18 октября 2019

Почему бы не это

for_each(arr.begin(),arr.end(), [&num](char c) {num.push_back(c);})
for_each(arr2.begin(),arr2.end(), [&num](char c) {num.push_back(c);})
0 голосов
/ 18 октября 2019

Это здесь

for (auto& i : arr, arr2)

Не будет работать, потому что это не то, что делает оператор запятой. Вы можете прочитать о запятом здесь . Короче говоря, arr, arr2 возвращает arr2, поэтому for (auto& i : arr, arr2) эквивалентно for (auto& i : arr2).

Вместо этого, поскольку arr и arr2 равны std::string, вы можете просто объединить их с помощью +:

for (auto& i : arr + arr2)
{
    num.push_back(i);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...