精华内容
下载资源
问答
  • fill、uninitialized_fill和fill_n、uninitialized_fill_n和copy、ininitialized_copy函数常常分不清楚,今天详细描述uninitialied前缀和非前缀的区别。  以fill与uninitialized_fill为例(三者类似),fill在STL...

            fill、uninitialized_fill和fill_n、uninitialized_fill_n和copy、ininitialized_copy函数常常分不清楚,今天详细描述uninitialied前缀和非前缀的区别。

            以fill与uninitialized_fill为例(三者类似),fill在STL源码剖析中描述为高层次函数,而uninitialized_fill为低层次函数,高层次和低层次的区别我也不甚了解(如果读者知道,请评论留言或私聊我-。-)。

            下面将从源码方面讲述两者的区别:

    uninitialized_fill源码:

    		// TEMPLATE FUNCTION uninitialized_fill
    template<class _FwdIt,
    	class _Tval> inline
    	void _Uninit_fill(_FwdIt _First, _FwdIt _Last, const _Tval& _Val,
    		_Nonscalar_ptr_iterator_tag)
    	{	// copy _Val throughout raw [_First, _Last), arbitrary type
    	_DEBUG_RANGE(_First, _Last);
    	_FwdIt _Next = _First;
    
    	_TRY_BEGIN
    	for (; _First != _Last; ++_First)
    		_Construct(&*_First, _Val);
    	_CATCH_ALL
    	for (; _Next != _First; ++_Next)
    		_Destroy(&*_Next);
    	_RERAISE;
    	_CATCH_END
    	}
    
    template<class _Ty,
    	class _Tval> inline
    	void _Uninit_fill(_Ty *_First, _Ty *_Last, const _Tval& _Val,
    		_Scalar_ptr_iterator_tag)
    	{	// copy _Val throughout raw [_First, _Last), scalar type
    	_STD fill(_First, _Last, _Val);
    	}
    
    template<class _FwdIt,
    	class _Tval> inline
    	void uninitialized_fill(_FwdIt _First, _FwdIt _Last, const _Tval& _Val)
    	{	// copy _Val throughout raw [_First, _Last)
    	_Uninit_fill(_First, _Last, _Val, _Ptr_cat(_First, _First));
    	}

              源码中提供两种形式得_uninit_fill函数。_Ty *的函数支持标量类型,使用的是fill函数,标量类型含义http://c.biancheng.net/ref/34.html ;_FwdIt 的函数使用的是构造construct进行构造。使用构造函数在指定内存位置构造对象(定位new)。

    fill的源码如下:

    		// TEMPLATE FUNCTION fill
    template<class _FwdIt,
    	class _Ty> inline
    	void _Fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
    	{	// copy _Val through [_First, _Last)
    	for (; _First != _Last; ++_First)
    		*_First = _Val;
    	}
    
    inline void _Fill(char *_First, char *_Last, char _Val)
    	{	// copy char _Val through [_First, _Last)
    	_CSTD memset(_First, _Val, _Last - _First);
    	}
    
    inline void _Fill(signed char *_First, signed char *_Last, signed char _Val)
    	{	// copy signed char _Val through [_First, _Last)
    	_CSTD memset(_First, _Val, _Last - _First);
    	}
    
    inline void _Fill(unsigned char *_First, unsigned char *_Last, unsigned char _Val)
    	{	// copy unsigned char _Val through [_First, _Last)
    	_CSTD memset(_First, _Val, _Last - _First);
    	}
    
    template<class _FwdIt,
    	class _Ty> inline
    	void fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
    	{	// copy _Val through [_First, _Last)
    	_DEBUG_RANGE(_First, _Last);
    	_Fill(_Unchecked(_First), _Unchecked(_Last), _Val);
    	}
    

            uninitialized_fill在fill的基础上区分了标量类型与复合类型,保证使用标量类型使用fill进行填充的正确性,非标量类型使用构造函数进行构造。而fill使用的是赋值运算符进行填充,如果fill填充的_Ty类型不支持赋值运算符,fill将编译失败。

            在无法确定容器存储的类型_Ty是否包含赋值运算符时,推荐使用uninitialized_fill进行设置。

    注:对于容器存储指针对象来说,fill和uninitialized_fill没什么区别。

    // T_stlfill_uninitialize_fill 不支持赋值运算符
    vector<T_stlfill_uninitialize_fill> copyBackward_src(4);
    T_stlfill_uninitialize_fill tsf;
    // 可以编译和运行
    uninitialized_fill(copyBackward_src.begin(), copyBackward_src.end(), tsf);
    // 无法编译
    //fill(copyBackward_src.begin(), copyBackward_src.end(), tsf);
    
    vector<T_stlfill_uninitialize_fill *> copyBackward_src(4);
    T_stlfill_uninitialize_fill *tsf = new T_stlfill_uninitialize_fill();
    // 可以编译和运行
    uninitialized_fill(copyBackward_src.begin(), copyBackward_src.end(), tsf);
    // 可以编译和运行。这是因为源码中赋值的是指针对象,不是指针所指的对象
    fill(copyBackward_src.begin(), copyBackward_src.end(), tsf);

     

     

     

    展开全文
  • fill_n

    2012-11-26 16:15:32
    #include #include #include #include #include using namespace std; int main() { string s("Hello there");... vector vector1(s.begin(), s.end());... fill_n(vector1.begin() + 5, 3, 'Y'); vector
    #include <iostream>
    #include <cassert>
    #include <algorithm>
    #include <vector>
    #include <string>
    using namespace std;
    
    int main()
    {
      string s("Hello there");
      vector<char> vector1(s.begin(), s.end());
    
    
      fill_n(vector1.begin() + 5, 3, 'Y');
    
      vector<char>::iterator pos;
    
      for (pos=vector1.begin(); pos!=vector1.end(); ++pos) {
            cout << *pos << ' ';
      }
    
    
      return 0;
    }
    
     /* 
    H e l l o Y Y Y e r e 
     */       
    
    include <iostream>
    using std::cout;
    using std::endl;
    
    #include <algorithm> // algorithm definitions
    #include <vector>    // vector class-template definition
    #include <iterator>  // ostream_iterator
    
    int main()
    {
       std::vector< char > chars( 10 );
       std::ostream_iterator< char > output( cout, " " );
       std::fill( chars.begin(), chars.end(), '5' ); // fill chars with 5s
      // fill first five elements of chars with As
       std::fill_n( chars.begin(), 5, 'A' );
    
    
       cout << "Vector chars after filling with 5s:\n";
       std::copy( chars.begin(), chars.end(), output );
       cout << endl;
       return 0;
    }
    /* 
    Vector chars after filling with 5s:
    A A A A A 5 5 5 5 5
    
     */
          


    展开全文
  • C++ fill fill_n

    2020-09-25 17:22:34
    #include<algorithm> #include<vector> #include<iostream> using namespace std; int main(){ ... //fill( iterator first, iterator last, key) ... //fill_n( iterator first, n
    #include<algorithm>
    #include<vector>
    #include<iostream>
    using namespace std;
    
    int main(){
    	vector <int> a(10);
    	//fill( iterator first, iterator last, key)
    	fill( a.begin(), a.end(), 1);
    
    	a.resize(15);
    
    	//fill_n( iterator first, n, key)
    	fill_n( a.begin()+10, 5, 2);
    	for(auto p = a.begin(); p != a.end(); p ++)
    		cout << *p << ' ';
    
    }
    
    展开全文
  • STL 算法实践,直接贴代码: #include #include #include #include using namespace std;... fill_n(ostream_iterator(cout," "),10,7.7); cout; vectorv; fill_n(back_inserter(v),10,10086);

    STL 算法实践,直接贴代码:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<functional>
    using namespace std;
    int main(){
    	fill_n(ostream_iterator<float>(cout," "),10,7.7);
    	cout<<endl;
    	vector<int>v;
    	fill_n(back_inserter(v),10,10086);
    	copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
    	cout<<endl;
    
    	fill(v.begin(),v.end(),10087);
    	copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
    	cout<<endl;
    
    	fill_n(v.begin()+2,8,0);
    	copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
    	cout<<endl;
    	system("pause");
    	return 0;
    }
    
    #include<iostream>
    #include<string>
    #include<vector>
    #include<algorithm>
    #include<ctime>
    #include<functional>
    using namespace std;
    int a(1);
    int changsheng(){
    	
    	return a++;
    }
    int suiji(){
    	return rand()%100;
    }
    class GaiBian{
    public:
    	GaiBian(int x):n(x){}
    	int operator()(){
    		return n++;
    	}
    private:
    	int n;
    };
    int main(){
    	vector<int>v;
    	vector<int>vv;
    	vv.resize(10);
    	generate_n(back_inserter(v),10,changsheng);
    	copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
    	cout<<endl;
    
    	generate(vv.begin(),vv.end(),GaiBian(10077));
    	for(vector<int>::iterator itera=vv.begin();itera!=vv.end();++itera){
    		cout<<*itera<<" ";
    	}
    	cout<<endl;
    	
    	srand(unsigned(time(NULL)));
    	generate(vv.begin(),vv.end(),suiji);
    	copy(vv.begin(),vv.end(),ostream_iterator<int>(cout," "));
    	cout<<endl;
    	system("pause");
    	return 0;
    }


     

    展开全文
  • fill函数的作用是:将一个区间的元素都赋予val值。...例题:给你n个数,然后输入一些操作:start,end,paint。表示从start到end都赋予paint的值,并输出每一次操作后的数组状态。 代码: #include #inc
  • fill() 和 fill_n() 算法提供了一种为元素序列填入给定值的简单方式,fill() 会填充整个序列; fill_n() 则以给定的迭代器为起始位置,为指定个数的元素设置值。下面展示了 fill() 的用法:std::vector data {12}; /...
  • fill函数和fill_n函数

    2015-04-21 21:57:00
    fill函数和fill_n函数 fill_n函数的作用是:给你一个起始点,然后再给你一个数值count和val。把从起始点开始依次赋予count个元素val的值。 注意: 不能在没有元素的空容器上调用fill_n函数 列子: fill...
  • C++ Primer 学习中。。。 简单记录下我的学习过程(代码为主) 全部容器适用 fill(b,e,v) //[b,e) 填充成v...fill_n(b,n,v) //[b,b+n) 填充成v generate(b,e,p) //[b,e) 依照p方法填充 generate_...
  • 使用fill_n算法

    千次阅读 2017-07-13 19:50:06
    今天使用这个算法来给一个数组赋值,所以把它的使用内存记录下来:fill_n函数的作用是:给你一个起始点,然后再给你一个数值count和val。把从起始点开始依次赋予count个元素val的值。 注意: 不能在没有元素的空...
  • fill(beg,end,newValue)和fill_n(beg,sum,newValue)的特点 1:迭代器类型 fill----前向迭代器,fill_n-----输出迭代器 2:返回值类型:void 3:算法功能:fill----将区间[beg,end)赋予新值newValue,fill_n-----将beg...
  • STL, Algorithm: fill, fill_n, generate, generate_n的例子程序
  • fill_n与generate_n的区别

    2011-06-23 10:27:00
    我第一次看到这个函数,我就立马意识到这是初始化容器的好方法。比如 view plaincopy to clipboardprint?...fill_n(back_inserter(l1), 200, 1000);仅仅一行代码,就可以初始化200个元素,每个赋值
  • C++ fill()和fill_n()函数用法 fill 和fill_n函数是C++ Primer第十二章泛型算法部分内容,并把它们称为生成和变异算法,也就是说这两个函数只能对输入范围内已存在的元素进行操作。如果试图对空容器进行fill_n操作...
  • std::fill_n

    千次阅读 2011-11-09 14:08:08
    fill_n 原型: #include  void fill_n( output_iterator start, SIZE n, const TYPE& val ); 函数fill_n()类似于fill. 与之不同的是fill_n()将val赋值给start开始的前n个元素. 例如, 下面的代码使用...
  •  fill_n(list2.begin(), 9, "F");  for (list_iter2 = list2.begin(); list_iter2 != list2.end(); ++list_iter2)  {  cout *list_iter2 ;  }  cout ;  cout ;  list<int> list3;  generate_n(back_...
  • C++算法fill()和fill_n()

    2019-09-18 08:41:29
    算法 返回值 作用 fill() void ... fill_n() _OutIt 改填元素 fill()的参数 _FwdIt _First, _FwdIt _Last,...
  • 转自c++ 如何批量初始化数组 fill和fill_n函数的应用 std::fill(a+2,a+10,0x3f3f3f3f);///从下标2到下标10 前闭后开 共8个 std::fill_n(a+2,10,0x3f3f3f3f);///从下标2 开始 填充10个 memset(a,0x7f7f7f7f,...
  • fill_n(vs2010) 引言 这是我学习总结<algorithm>的第十四篇,作为fill的亲兄弟,fill_n也会助你一把的。 作用 fill_n 的作用是给一段指定长度的数据向量初始化,而fill是给一段指定范围(可能不...
  • fill 和fill_n函数是C++ Primer第十二章泛型算法部分内容,并把它们称为生成和变异算法,也就是说这两个函数只能对输入范围内已存在的元素进行操作。如果试图对空容器进行fill_n操作,会导致严重的运行错误,所以在...
  • <div><p>This is a ... This brings <code>parallel::fill</code> and <code>parallel::fill_n</code> into accordance with the Ranges TS. </p><p>该提问来源于开源项目:STEllAR-GROUP/hpx</p></div>
  • 原文地址:http://www.cplusplus.com/reference/algorithm/fill_n/ function template std::fill_n C++98 ... OutputIterator fill_n (OutputIterator first, Size n, const T&
  • C++ fill,fill_n

    2014-02-09 01:34:37
    #include #include #include #include #include using namespace std; int main(){ array t1 = {3,5,7,11,13,17,19,23}; array t2; fill(t2.begin(),t2.end(),5);... fill_n(t2.begin(),5,4); for_eac
  • algorithm—fill_n()

    2013-07-04 11:37:09
    原文转自:... 原型: #include  void fill_n( output_iterator start, SIZE n, const TYPE& val ); 函数fill_n()类似于fill. 与之不同的是fill_n()将val赋值给start开始的前n个
  • c++stl和std C ++ STL std :: fill_n()函数 (C++ STL std::fill_n() function) fill_n() function is a library function of algorithm header, it is used to assign a value to the n elements of a container, it...
  • STL 之fill和fill_n

    千次阅读 2014-04-14 19:15:46
    返回 作用:向容器中填充元素。 定义: ...void fill(forwardItr first, forwardItr last, const Type& value);...void fill_n(forwardItr first, size n, const Type& value); 示例代码: #include

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,015
精华内容 1,606
关键字:

fill_n