【问题标题】:Why is std::vector::insert a no-operation with an empty initializer-list?为什么 std::vector::insert 是一个空初始化列表的无操作?
【发布时间】:2022-06-10 23:50:46
【问题描述】:

在以下代码中:

#include <iostream>
#include <vector>

int main()
{
    std::cout<<"Hello World";
    std::vector<std::vector<int>> v;
    while(v.size() <= 2){
        v.insert(v.begin(),{}); //1
        std::cout << "!";
    }
    return 0;
}

每次迭代的输出都变得越来越激进,因为尽管insert 操作,v.size() 从未增加。

但是,当initializer_list 中有一个元素,或者替换为一个临时元素时,循环运行的次数与预期的一样多。

...
v.insert(v.begin(),{0}); //1
...
...
v.insert(v.begin(),std::vector<int>()); //1
...

这是为什么呢?如果隐式转换失败,不应该出现编译错误吗?

【问题讨论】:

  • 没有“隐式强制转换”之类的东西。强制转换是您在源代码中编写的内容,用于告诉编译器进行转换。所以 cast 总是显式的。 转换可以是隐式的。
  • 谢谢!我用那个更新了 Q

标签: c++ vector insert


【解决方案1】:

您的代码要求将初始化列表中的尽可能多的项目惰性化到向量中。由于初始化列表中没有任何项目,因此不会插入任何内容。

我不确定您的期望是什么,也许您期望从初始化列表中创建一个向量并插入该向量,即

v.insert(v.begin(),std::vector<int>{})

但这不会发生,因为vector&lt;T&gt;::insert 有一个重载,它直接采用initializer_list&lt;T&gt;(其行为与我在上面描述的一样)。

【讨论】:

  • 是的,本来想插入一个向量,没想到insert这个超载,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2015-05-22
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
相关资源
最近更新 更多