c++ 如何批量初始化数组

c++ 如何批量初始化数组fill函数,fill_n函数与memset函数的区别对,没有错,我就是懒得写那几行循环的代码.我们首先定义两个数组:inta[1000];charstr[1000];现在要把a里面1000个全部初始化为5;str里面全部初始化为a;inta[1000]={0};charstr[1000]={‘a’};但这样只有第一个元素被设置,其余999个自动默认是int的0;我们先来看

大家好,欢迎来到IT知识分享网。c++

fill函数,fill_n函数与memset函数的区别

对,没有错,我就是懒得写那几行循环的代码.

我们首先定义两个数组:

int a[1000];
char str[1000];

现在要把a里面1000个全部初始化为5;str里面全部初始化为a;

int a[1000] = {
  
  0}; 
char str[1000] = {
  
  'a'}; 

但这样只有第一个元素被设置,其余999个自动默认是int 的0;

我们先来看下memset的用法

首先,memset函数是逐字节进行填充,所以str一般为char *型。
其次,对于其它类型的a,可以填充的值有两个:0和-1.

这是由于计算机中用二进制补码表示数字,0和二进制补码为全0,-1的二进制补码为全1。
最后,如果是memset(a,5,1000*sizeof(int)),就会对每个字节填充5,所以一个int则为0x05050505。

所以我们可以先解决char str[1000]的批量填充.

#include <cstring>
memset(str,'a',sizeof(str))

fill和fill_n的用法

按照单元赋值,将一个区间的元素都赋同一个值.
我们还是来看下实现吧:

void fill(ForwardIt first, ForwardIt last, const T& value);
void fill_n(OutputIt first, size n, const T& value);
功能:
fill给迭代器范围[first, last)内元素均赋值为value。无返回值。
fill_n将first指向范围内的前n个元素赋值为value。返回first+n(c++11)

template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
  while (first != last) {
    *first = val;
    ++first;
  }
}

template <class OutputIterator, class Size, class T>
OutputIterator fill_n (OutputIterator first, Size n, const T& val)
{
  while (n>0) {
    *first = val;
    ++first; --n;
  }
  return first;     // since C++11
}

对,你没有看错,其实就是循环在干这样的事情.

 vector<int> myvector (8,10); // myvector: 10 10 10 10 10 10 10 10

fill_n (myvector.begin(),4,20); // myvector: 20 20 20 20 10 10 10 10
fill_n (myvector.begin()+3,3,33); // myvector: 20 20 20 33 33 33 10 10

所以我们可以解决int a[1000]的批量填充.

#include <algorithm>
fill_n(a, 1000, 5);
fill(a, a+1000, 5);

特别需要注意的是fill和fill_n的最后一个参数,我们可以看到是一个引用,所以在我们传递的是一个指针的时候,实际上,填充的都是同一个地址,一旦指针指引的对象被析构,填充的所有指针都会变成野指针.

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/20933.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信