Вот два разных типа станд :: вектор, как пример:Как сравнить и назначить между std :: vector <T> и std :: vector <std :: reference_wrapper <T>>?
std::vector<std::reference_wrapper<MyClass>> rv;
std::vector<MyClass> v;
Возможный способ назначить между ними:
for (const auto& mc : rv) {
v.push_back(mc.get());
}
Он работает. Но уродливый и, возможно, медленный. То же самое, что и сравнение:
bool is_same(std::vector<MyClass>& v, std::vector<std::reference_wrapper<MyClass>>& rv) {
if (v.size()!=rv.size()) {
return false;
}
for (size_t i = 0; i < v.size(); v++) {
if (v[i]!=rv[i].get()) {
return false;
}
}
return true;
}
Есть ли лучший способ для выполнения этой работы? Умный и быстрый.
Я бы использовал 'std :: equal (begin (v), end (v), begin (rv), end (rv))', а не 'v.size() == rv.size() && end (v) == std :: mismatch (begin (v), end (v), begin (rv), end (rv)). first'. 'std :: equal' не только яснее, но и сохраняет одно сравнение итератора на каждой итерации. – cpplearner
@cpplearner - Спасибо. Я не должен был писать этот ответ, прежде чем пить кофе. – StoryTeller