c++ 中的copy(),istream_iterator,unique()函数

copy函数: 

template <class InputIterator,类OutputIterator>
  OutputIterator copy(InputIterator first,InputIterator last,OutputIterator result);
复制元素范围
将范围中的元素复制[first,last)到从结果开始的范围内。

该函数将迭代器返回到目标范围的末尾(指向复制的最后一个元素后面的元素)。

范围不应以结果指向[first,last]范围内的元素的方式重叠。对于这种情况,请参阅copy_backward。

此函数模板的行为等效于:

template<class InputIterator, class OutputIterator>
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
  while (first!=last) {
    *result = *first;
    ++result; ++first;
  }
  return result;
}

实例1:
int myints[]={10,20,30,40,50,60,70};
  std::vector<int> myvector (7);
  std::copy ( myints, myints+7, myvector.begin() );
实例2:
 头文件#include<iterator>
 vector<int> ivec;
 copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(ivec));//istream_iterator<int>()为空指向的是流结束的位置,另外类型是int时,输入有非int类型时情况相同,比如istream<T> in();时变量in 就相当于指向EOF标志的iterator
  //下句为将ivec内容输出屏幕
  copy(ivec.begin(),ivec.end(),ostream_iterator<int>(cout,"\t"));//“ "为间隔符,可以转义或其他非转义字符

另外直接将一个输入流输入到一个vwctor的向量中:
vector<int> ivec(istream_iterator<int>(cin),istream_iterator<int>());

重载输入/输出流:

istream& operator >>(istream &input, sales_data &s)//对重载运算符>>进行定义
{
	input >> s.bookno >> s.units_sold >> s.price;
	if (input)
	{
		s.revenue = s.units_sold * s.price;
	}
	return input;
}
ostream& operator << (ostream &output, sales_data &s)//对重载运算符<<进行定义
{
	
	output << s.bookno << " " << s.units_sold << " " << s.revenue << " " << s.avg_price() << endl;
	return output;
}

test.cpp
sales_data ss;
ss = add(total, trans);
cout << ss << endl;

自定义输入输出流:

unique()函数:

删除范围内的连续重复项
从范围中的每个连续的等效元素组中删除除第一个元素之外的所有元素[first,last)。

该函数不能改变包含元素范围的对象的属性(即,它不能改变数组或容器的大小):通过用下一个不重复的元素替换重复元素来完成删除,并且通过将迭代器返回到应该被视为其新的past-the-end元素的元素来发信号通知缩短范围的新大小。

保留未删除元素的相对顺序,而返回的迭代器和last之间的元素保持有效但未指定的状态。

该函数用于operator==比较元素对(或pred,in version (2))。

此函数模板的行为等效于:

template <class ForwardIterator>
  ForwardIterator unique (ForwardIterator first, ForwardIterator last)
{
  if (first==last) return last;

  ForwardIterator result = first;
  while (++first != last)
  {
    if (!(*result == *first))  // first已经++ ,此时比较的是result(当前)和first(下一个)是否相同的比较;
      *(++result)=*first;// 如不同则将元素存放在result下个位置,因此result存放的是first相邻的不同元素,直到遍历完
  }
  return ++result;//??result指向
}

unique()应用:

https://blog.csdn.net/qq_41139830/article/details/80631988

#include <iostream>
#include <cassert>
#include <algorithm>
#include <vector>
#include <string>
#include <iterator>
 using namespace std;

 int main()
{
    //cout<<"Illustrating the generic unique algorithm."<<endl;
    const int N=11;
    int array1[N]={1,2,0,3,3,0,7,7,7,0,8};
    vector<int> vector1;
    for (int i=0;i<N;++i)
        vector1.push_back(array1[i]);

    vector<int>::iterator new_end;
    new_end=unique(vector1.begin(),vector1.end());    //"删除"相邻的重复元素
    assert(vector1.size()==N);

    vector1.erase(new_end,vector1.end());  //删除(真正的删除)重复的元素
    copy(vector1.begin(),vector1.end(),ostream_iterator<int>(cout," "));
    cout<<endl;

    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值