使用引用形参返回额外的信息

引用形参的另一种用法是向主调函数返回额外的结果。

函数只能返回单个值,但有些时候,函数有不止一个的内容需要返回。例如,定义一个 find_val 函数。在一个整型 vector 对象的元素中搜索某个特定值。如果找到满足要求的元素,则返回指向该元素的迭代器;否则返回一个迭代器,指向该 vector 对象的 end 操作返回的元素。此外,如果该值出现了不止一次,我们还希望函数可以返回其出现的次数。在这种情况下,返回的迭代器应该指向具有要寻找的值的第一个元素。

如何定义既返回一个迭代器又返回出现次数的函数?我们可以定义一种包含一个迭代器和一个计数器的新类型。而更简便的解决方案是给 find_val 传递一个额外的引用实参,用于返回出现次数的统计结果:

  // returns an iterator that refers to the first occurrence of value
  // the reference parameter occurs contains a second return value
  vector<int>::const_iterator find_val(
  vector<int>::const_iterator beg, // first element
  vector<int>::const_iterator end, // one past last element
  int value, // the value we want
  vector<int>::size_type &occurs) // number of times it occurs
  {
  // res_iter will hold first occurrence, if any
  vector<int>::const_iterator res_iter = end;
  occurs = 0; // set occurrence count parameter
  for ( ; beg != end; ++beg)
  if (*beg == value) {
  // remember first occurrence of value
  if (res_iter == end)
  res_iter = beg;
  ++occurs; // increment occurrence count
  }
  return res_iter; // count returned implicitly in occurs
  }

调用 find_val 时,需传递四个实参:一对标志 vector 对象中要搜索的元素范围的迭代器,所查找的值,以及用于存储出现次数的 size_type 类型对象。假设 ivec 是 vector<int>, it 类型的对象,it 是一个适当类型的迭代器,而 ctr 则是 size_type 类型的变量,则可如此调用该函数:

  it = find_val(ivec.begin(), ivec.end(), 42, ctr);

调用后,ctr 的值将是 42 出现的次数,如果 42 在 ivec 中出现了,则 it 将指向其第一次出现的位置;否则,it 的值为 ivec.end(),而 ctr 则为 0。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值