将2d向量的值设置为0的快速方法

use*_*060 1 c++ vector

给出以下示例

#include <iostream>
#include <vector>
#include <algorithm>
#include<iterator>

using namespace std;

template<typename T>
ostream& operator<<(ostream& os, const vector<T>& v){
    copy(v.begin(), v.end(), ostream_iterator<T>(os, "  "));
    return os;
}


int main (){

vector<int>vec;
vector<vector<int>> x(10,vector<int>());
for(int i=0; i< x.size(); i++)
    x[i].resize((rand() % 100 + 1), 10);

for(int i=0; i< x.size(); i++)
    fill(x[i].begin(),x[i].end(),0);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

将第二个向量中的值设置为0的最快方法是什么

日Thnx

Jos*_*eld 5

完全不需要std::vector用零填充内部s,因为resize默认 - 将新元素插入到值初始化它们的向量中.在ints 的情况下,值初始化意味着将它们设置为0.


从标准中确定这一点可能有点困难,所以这里的路径(来自N4296 - C++ 14草案):

从定义resize:

如果size() < sz,将sz - size()默认插入的元素附加到序列中.

定义default-inserted:

X如果通过评估表达式初始化元素,则默认插入元素

allocator_traits<A>::construct(m, p)
Run Code Online (Sandbox Code Playgroud)

其中p是在X[并且m是类型的分配器A]中分配的元素的未初始化存储的地址.

定义allocator_traits<A>::construct:

template <class T, class... Args>
static void construct(Alloc& a, T* p, Args&&... args);
Run Code Online (Sandbox Code Playgroud)

效果:a.construct(p, std::forward<Args>(args)...)如果该调用格式正确,则调用; 除此以外, [...].

从分配器的定义:

a.construct(c, args)
Run Code Online (Sandbox Code Playgroud)

效果:在c处构造一个C类型的对象

默认: ::new ((void*)c) C(forward<Args>(args)...)

new-expression 的定义:

  • 如果省略new-initializer,[...]

  • 否则,根据8.5的初始化规则解释new-initializer以进行直接初始化.

从直接初始化的定义:

  • [...]

  • 如果初始化程序为(),则对象进行值初始化.

  • [..]

值初始化:

  • 如果T是一个(可能是cv限定的)类类型[...];
  • 如果T是一个(可能是cv限定的)类类型[...];
  • 如果T是数组类型,那么[...];
  • 否则,该对象被零初始化.

零初始化:

  • 如果T是标量类型(3.9),则将对象初始化为通过将整数0(零)转换为T而获得的值;

  • 如果[...]