gpt4 book ai didi

c++插入空 vector 不能使用大括号

转载 作者:行者123 更新时间:2023-12-01 14:20:08 25 4
gpt4 key购买 nike

当我引用 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

Live Demo on coliru

注意:

我知道重载 std::vector 至少是一种糟糕的风格.我特别这样做是为了展示所使用的函数调用(我不知道如何实现这一点)。

关于c++插入空 vector 不能使用大括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62808715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com