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

标签 c++ vector std

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

相关文章:

.net - 用visual studio开发和编译的c++程序

c++ - 获取 vector 的总和

使用 vector 推回和迭代器时出现 C++ 运行时错误

c# - 如何找到与给定向量正交的随机向量

c++ - 如何通过STL容器和算法库计算两个 vector 的内积?

c++ - struct 中的 std::list 导致内存冲突错误

c++ - 我应该使用元组 vector 还是数组 vector ?

当函数是从存储在夹具结构中的对象构建时,C++ Lambda 构建静态函数返回意外值

c++ - C++写入标准输入(在Windows中)

C:为什么我得到无效的初始值设定项?