Я новичок в C++ и, следовательно, мне понадобится помощь в выполнении определенной задачи. Проблема в том, что мне нужно перебирать три или более векторов одновременно, вот так:
#include <vector>
#include <iostream>
#include <string>
#include <boost/range/combine.hpp>
using namespace std;
int main(int, char**) {
vector<string> questions = {"Planet", "Rocket", "Galaxy"};
vector<string> answers = {"Planet", "Saturn", "Star"};
vector<int> count = { 12, 34, 79};
vector<int> score = { 324, 956, 289};
vector<int> result;
vector<int> subscore;
string a, q;
int c, s;
for ( const string q : questions ) {
int match = 0;
for( auto tuple : boost::combine(answers, count) ) {
boost::tie(a,c) = tuple;
if ( q.substr(0,2) == a.substr(0,2)) {std::cout << q.substr(0,3) << " " << a.substr(0,3) << endl; match = c; }
else cout << "No match!" << '\n';
}
if ( match ) { result.push_back(match); }
else result.push_back(0); subscore.push_back(0);
Этот подход работает, но я не могу использовать его в используемом нами фреймворке.
Может быть, кто-то здесь может указать мне подобное решение, которое не зависит от ускорения, но все же эффективно.
Большое спасибо!
Использование старого доброго индекса недостаточно?
работа с фреймворком анализа данных ROOT. По умолчанию он не знает о повышении. Поэтому, возможно, лучше вернуться к стандартному C++.
Фреймворк не ограничивает вас вещами, которые он «знает», или он в меньшей степени является фреймворком или больше препятствием.
@Slava: index может быть в порядке - я надеялся, что кто-то сможет показать мне, как двигаться в этом направлении
Знаете ли вы, что вы можете копировать строку дважды за итерацию?
@Slava: да, я знал о копиях, но так как это был всего лишь небольшой пример, я бы не нанес слишком большой ущерб.
@ Number42 нет, это не должно причинить никакого вреда, особенно на массиве из 3 элементов. Я просто спросил, знаете ли вы о скрытой стоимости.
@Slava: спасибо, что указали на это. Для более крупного приложения я бы это изменил.





Вы можете использовать старый добрый индекс:
auto size = std::min( answers.size(), count.size() ); // or at least assert that size is equal
for( size_t i = 0; i < size; ++i ) {
const auto &a = answers[i];
const auto c = count[i];
// .. same as before
обратите внимание, что таким образом вы, возможно, избегаете делать 2 копии std::string за итерацию - ответы -> кортеж -> a
Это отлично работает, большое спасибо за поддержку.
Это похоже на transform, поэтому в C++ вы можете использовать std::transform ... например:
#include <vector>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(int, char**) {
vector<string> questions = {"Planet", "Rocket", "Galaxy"};
vector<string> answers = {"Planet", "Saturn", "Star"};
vector<int> count = { 12, 34, 79};
vector<int> result;
for(const auto& q : questions)
{
transform(begin(answers), end(answers), begin(count), back_inserter(result),
[&q](const auto& answer, auto count)
{
if (q.substr(0, 2) == answer.substr(0, 2))
{
std::cout << q.substr(0,3) << " " << answer.substr(0,3) << endl;
return count;
}
else
cout << "No Match!" << endl;
return 0;
});
}
}
Теперь вектор results содержит все результаты. back_inserter используется для динамического роста resultstd::vector.
Почему вы не можете использовать ускорение в своем фреймворке?