C++ c++;插入空向量不能使用大括号
下面的代码不能正常工作,当我引用C++ c++;插入空向量不能使用大括号,c++,vector,std,C++,Vector,Std,下面的代码不能正常工作,当我引用it时,它会导致成员调用空指针错误,如果它不受支持,为什么它允许使用insert(end,{})(无编译错误) #包括 #包括 使用名称空间std; int main(){ 向量vv; autoit=vv.insert(vv.end(),{}); cout size()行autoit=vv.insert(vv.end(),{});正在使用表单 当int行auto it=vv.insert(vv.end(),{});时,初始化器列表没有元素,因此向量vv中没有插入元
it
时,它会导致成员调用空指针错误
,如果它不受支持,为什么它允许使用insert(end,{})
(无编译错误)
#包括
#包括
使用名称空间std;
int main(){
向量vv;
autoit=vv.insert(vv.end(),{});
cout size()行autoit=vv.insert(vv.end(),{});
正在使用表单
当int行auto it=vv.insert(vv.end(),{});
时,初始化器列表没有元素,因此向量vv
中没有插入元素
由于没有插入任何元素,因此它与vv.end()
相同,因此它对遵从无效
您可以在插入后通过检查vv
的长度来验证它。请参阅以检查它。根据,所有insert()
风格返回第一个插入元素的迭代器,或者如果没有插入任何元素,则返回插入位置
在OPs暴露的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;
}
不使用
迭代器插入(常量迭代器位置、常量T和值)
正如预期的那样,但是
迭代器插入(const_iterator pos,std::initializer_list ilist);
因此,插入了0个元素,insert()
返回传递的end()
迭代器
所以
输出:
插入初始值设定项列表
0
注意:
我知道,至少,重载std::vector
是一种糟糕的风格。
我做了这个,特别是显示了使用函数调用(我没有更好的想法如何实现这一点)。<编译>错误并不是说你认为它是什么东西。在C++中,你可以编写很多东西而不需要编译错误,它可以用来代替原来的代码>迭代器插入(conthyTyror POS,const t和value)。
。我现在明白了,因为他的答案比@cse早,而且你的repu比@cse高得多,所以我接受了他的答案。@BAKEZQ这是你的决定。;-)感谢你的详细解释。如果我在cppref中更仔细地检查,我会发现这一点。我从未检查过初始值设定项列表的详细信息,但大多数时候它都像我预期的那样工作,然而,这是我的我的直觉失败了。
auto it = vv.insert(vv.end(), {});
cout << it->size() << endl;
#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;
}