Используя повышение:: iostreams:: tee_device?

Похоже, вам нужно это:

L1_it = iter(L1)

result = [[[L2_element, *next(L1_it)] for L2_element in sublist] for sublist in L2]  

Это можно расширить следующим образом:

L1_it = iter(L1)

result = []

for L2_sublist in L2:
    result_sublist = []
    for L2_element in L2_sublist:
        result_sublist.append([L2_element, *next(L1_it)])

    result.append(result_sublist)

Оба метода дают одинаковый результат:

[[['eɪ', 0.0, 0.22]], [['æ', 0.0, 0.13], ['f', 0.03, 0.19], ['ɹ', 0.14, 0.49], ['i', 0.2, 0.55], ['k', 0.5, 0.61], ['ʌ', 0.56, 0.72], ['n', 0.62, 0.82]], [['eɪ', 0.0, 0.11], ['ʤ', 0.03, 0.31], ['ʌ', 0.12, 0.47], ['n', 0.32, 0.55], ['t', 0.48, 0.72], ['s', 0.56, 0.75]], [['ɔ', 0.0, 0.09], ['l', 0.03, 0.16]]]

Чтобы добраться до этого фрагмента кода, мы видим, что ожидаемый результат имеет ту же структуру, что и L2, за исключением того, что элементы в порядке выполнения из L1 добавляются к каждому подсписку в L2, как если бы он был сплющен.

7
задан Piotr Dobrogost 11 July 2009 в 18:57
поделиться

2 ответа

Вы используете передающую конструктора версию io::stream, которые создают сам поток мишени и передают все аргументы этому. C++ 03 только ограничил возможности когда дело доходит до передачи аргументов функциям (объем перегрузок, необходимых легко вырасти экспоненциально). Это (io::stream) делает следующие ограничения:

Каждый из этих участников создает экземпляр потока и связывает его с экземпляром Устройства T созданный из данных списков аргументов. Вовлеченные конструкторы T должны взять все аргументы ссылкой константы или значением.

Ну, но tee_device конструктор говорит

Создает экземпляр tee_device на основе данной пары Приемников. Каждый параметр функции является ссылкой неконстанты, если соответствующий аргумент шаблона является потоковым или потоковым буферным типом и ссылкой константы иначе.

Это не будет работать, конечно. io::stream предоставляет другому конструктору, который берет a T как первый аргумент. Это работает здесь (Компиляции, по крайней мере. Сбои утверждения, все же. Я не работал с boost::iostreams таким образом, я не могу помочь с этим),

namespace io = boost::iostreams;
typedef io::tee_device<std::stringstream, std::stringstream> TeeDevice;
typedef io::stream< TeeDevice > TeeStream;
std::stringstream ss1, ss2;
TeeDevice my_tee(ss1, ss2); 
TeeStream my_split(my_tee);
my_split << "Testing";
assert(ss1.str() == "Testing" && ss1.str() == ss2.str());

Править: После вызова flush() или потоковая передача << std::flush, передачи утверждения.

11
ответ дан 6 December 2019 в 19:42
поделиться

Вероятно, необходимо настроить его как это:

typedef io::tee_device<std::stringstream, std::stringstream> Tee;
typedef io::stream<Tee> TeeStream;

std::stringstream ss1, ss2;
Tee my_tee(ss1, ss2);
TeeStream my_split(my_tee);
2
ответ дан 6 December 2019 в 19:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: