Давайте рассмотрим пример, в котором нам нужно вставить вектор, возвращенный функцией, в другой вектор:
const std::vector<int> getvec(){
return {1, 2, 3};
}
// in main...
std::vector<int> foo{ 11, 12 };
auto bar = getvec();
foo.insert(foo.end(), bar.begin(), bar.end());
Тот факт, что на переменную bar
необходимо дважды ссылаться в методе insert()
делает необходимым хранить вектор как переменную (иначе мы могли бы сделать foo.myinsert(getvec())
, если бы был такой интерфейс).
Меня немного раздражает, что в таком случае нам нужно ввести переменная foo
в основной области видимости, которая не предназначена для повторного использования в остальной части кода, поскольку она занимает память и загрязняет пространство имен. Особенно проблема, если мы говорим о большом «временном» объекте.
Есть ли стандартный подход к этому? Мы могли бы определить функцию, которая принимает «временный» объект только один раз, чтобы мы могли напрямую передавать ему выходные данные функции, но было бы трудно управлять, если бы нам нужно было определять такую функцию для каждого подобного сценария. Также, как и в этом примере, мы не можем определить функцию-член для класса vector
.
В качестве альтернативы, что использовать фигурные скобки для ограничения объема «временной» части вставки, но я хотел бы знать, любые оговорки здесь.
vector<int> foo{ 11, 12 };
{ // extra brace here
auto bar = getvec();
foo.insert(foo.end(), bar.begin(), bar.end());
} // extra brace here