当我引用 it
时,下面的代码无法正常工作, 它导致 Member call on null pointer error
,如果不支持,为什么允许使用 insert(end, {})
(没有编译错误)。
#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;
}
当我改变{}
to vector<pair<int, int>>
, 没有错误显示并打印 0
.
通过评论解决,调用iterator insert( const_iterator pos, std::initializer_list<T> ilist )
, 所以改成insert(end, {{}})
可以工作。
最佳答案
根据 cppreference – std::vector<T,Allocator>::insert() , 各种口味 insert()
返回第一个插入元素的迭代器,如果没有插入则返回插入位置。
在暴露 MCVE 的 OP 中:
#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
注意:
我知道重载 std::vector
至少是一种糟糕的风格.
我特别这样做是为了展示所使用的函数调用(我不知道如何实现这一点)。
关于c++插入空 vector 不能使用大括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62808715/