Согласно cppreference - std :: vector :: insert () , все разновидности insert()
возвращают итератор первого вставленного элемента или позицию вставки, если ничего не было вставлено.
В OP открытые MCVE:
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<vector<pair<int, int>>> vv;
auto it = vv.insert(vv.end(), {});
cout << it->size() << endl;
}
в строке
auto it = vv.insert(vv.end(), {});
не используется iterator insert( const_iterator pos, const T& value );
как и следовало ожидать, но iterator insert( const_iterator pos, std::initializer_list<T> ilist );
.
Следовательно, вставлено 0 элементов, и insert()
возвращает итератор end()
, который был передан.
Итак,
cout << it->size() << endl;
обращений содержимое end()
, которое является неопределенным поведением.
Я сделал небольшой образец, чтобы продемонстрировать это:
#include <initializer_list>
#include <iostream>
#include <vector>
template <typename T>
struct Container: std::vector<T> {
using typename std::vector<T>::iterator;
using typename std::vector<T>::const_iterator;
iterator insert( const_iterator pos, const T& value )
{
std::cout << "insert single value\n";
return std::vector<T>::insert(pos, value);
}
iterator insert( const_iterator pos, std::initializer_list<T> ilist )
{
std::cout << "insert initializer list\n";
return std::vector<T>::insert(pos, ilist);
}
};
using namespace std;
int main() {
Container<vector<pair<int, int>>> vv;
auto it = vv.insert(vv.end(), {});
cout << /*it->*/vv.size() << endl;
}
Вывод:
insert initializer list
0
Live Demo на coliru
Примечание:
Я знаю, что, по крайней мере, перегружать std::vector
- плохой стиль. Я сделал это исключительно для того, чтобы показать используемый вызов функции (и у меня не было лучшего представления, как этого добиться).