题目大意:给定两个矩阵,矩阵的最大大小是M*N(小于等于10),矩阵元素的值的绝对值小于等于100,求矩阵相加后全0的行以及列数。

 #include<iostream>
using namespace std;
#define N 10 int main()
{
int n,m,i,j,a[N][N],b[N][N],s;
while(cin>>m)
{ if(m==) break;
cin>>n;
for(i=;i<m;i++)
for(j=;j<n;j++)
cin>>a[i][j];
for(i=;i<m;i++)
for(j=;j<n;j++)
{ cin>>b[i][j];
a[i][j]+=b[i][j];
}
s=;
for(i=;i<m;i++)
{ for(j=;j<n;j++)
if(a[i][j]!=) break;
if(j==n) s++;
}
for(j=;j<n;j++)
{ for(i=;i<m;i++)
if(a[i][j]!=) break;
if(i==m) s++;
}
cout<<s<<endl;
}
return ;
}

在网上看到一个大神用纯C++的思想写了如下代码:

 #include <iostream>
#include <vector>
#include <algorithm>
using namespace std; int add(int a, int b){
return a+b;
} int main(){
vector<int> ivec1;
vector<int> ivec2; int m, n, sum, data;
while(cin >> m){
if( == m){
break;
}
cin >> n;
sum = m * n;
for(int i=; i!=sum; ++i){
cin >> data;
ivec1.push_back(data);
}
for(int i=; i!=sum; ++i){
cin >> data;
ivec2.push_back(data);
}
transform(ivec1.begin(), ivec1.end(), ivec2.begin(), ivec1.begin(), add);
int count = ;
int temp;
for(int i=; i!=m; ++i){
temp = ;
for (int j=; j!=n; ++j){
temp += ivec1[i*n + j];
}
if ( == temp){
count++;
}
}
for(int i=; i!=n; ++i){
temp = ;
for (int j=; j!=m; ++j){
temp += ivec1[j*n + i];
}
if ( == temp){
count++;
}
}
cout << count << endl;
ivec1.resize();
ivec2.resize();
}
return ;
}

上面出现了transform的用法,在这里介绍下其用法:

 /*////////////////////////////////
template < class InputIterator, class OutputIterator, class UnaryOperator >
OutputIterator transform ( InputIterator first1, // 源容器的起始地址
InputIterator last1, // 源容器的终止地址
OutputIterator result, // 目标容器的起始地址
UnaryOperator op ); // 函数指针
// typedef 目标容器元素类型 (*UnaryOperator)(源容器元素类型); template < class InputIterator1, class InputIterator2,
class OutputIterator, class BinaryOperator >
OutputIterator transform ( InputIterator1 first1, // 源容器1的起始地址
InputIterator1 last1, // 源容器1的终止地址
InputIterator2 first2, // 源容器2的起始地址,元素个数与1相同
OutputIterator result, // 目标容器的起始地址,元素个数与1相同
BinaryOperator binary_op ); // 函数指针
// typedef 目标容器元素类型 (*BinaryOperator)(源容器1元素类型,源容器2元素类型);
//*//////////////////////////////// #include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std; int op_increase (int i)
{
return i+;
} int op_sum (int i, int j)
{
return i+j;
} int to_upper(int c)
{
if (islower(c))
{
return (c-);
} return c;
} int to_lower(int c)
{
if (isupper(c))
{
return c+;
} return c;
} int main () {
vector<int> first;
vector<int> second;
vector<int>::iterator it; // set some values:
for (int i=; i<; i++) first.push_back (i*); // first: 10 20 30 40 50 ///将first容器的元素加1赋值给second容器
second.resize(first.size()); // allocate space !!!必须预先设置一个大小与first相同
transform (first.begin(), first.end(), second.begin(), op_increase); // second: 11 21 31 41 51
cout << "second contains:";
for (it=second.begin(); it!=second.end(); ++it)
{
cout << " " << *it;
}
cout << endl;
//*//////////////////////////////////////////// ///将first容器的元素与second容器的元素相加,并将得到的结果重新赋值给first
transform (first.begin(), first.end(), second.begin(), first.begin(), op_sum); // first: 21 41 61 81 101
cout << "first contains:";
for (it=first.begin(); it!=first.end(); ++it)
cout << " " << *it;
cout << endl;
//*////////////////////////////////////////////////////////////////////////// ///大小写转换/////////////////////////////////////
string strsrc("Hello, World!");
string strdest;
strdest.resize(strsrc.size()); // !!!必须预先设置一个大小与strsrc相同
transform(strsrc.begin(), strsrc.end(), strdest.begin(), to_upper); // 转换为大写
cout << strdest << endl; transform(strsrc.begin(), strsrc.end(), strdest.begin(), to_lower); // 转换为小写
cout << strdest << endl;
//*///////////////////////////////////////// return ;
}

我们已经了解了一种区间元素交换swap_ranges函数,现在我们再来学习另外一种区间元素交换transform。该算法用于实现容器元素的变 换操作。有如下两个使用原型,一个将迭代器区间[first,last)中元素,执行一元函数对象op操作,交换后的结果放在 [result,result+(last-first))区间中。另一个将迭代器区间[first1,last1)的元素*i,依次与 [first2,first2+(last-first))的元素*j,执行二元函数操作binary_op(*i,*j),交换结果放在 [result,result+(last1-first1))。

函数原型:

  1. template < class InputIterator, class OutputIterator, class UnaryOperator >
  2. OutputIterator transform ( InputIterator first1, InputIterator last1,
  3. OutputIterator result, UnaryOperator op );
  4. template < class InputIterator1, class InputIterator2,
  5. class OutputIterator, class BinaryOperator >
  6. OutputIterator transform ( InputIterator1 first1, InputIterator1 last1,
  7. InputIterator2 first2, OutputIterator result,
  8. BinaryOperator binary_op );

     参数说明:

first1, last1
指出要进行元素变换的第一个迭代器区间 [first1,last1)。
first2
指出要进行元素变换的第二个迭代器区间的首个元素的迭代器位置,该区间的元素个数和第一个区间相等。
 
result
指出变换后的结果存放的迭代器区间的首个元素的迭代器位置
op
用一元函数对象op作为参数,执行其后返回一个结果值。它可以是一个函数或对象内的类重载operator()。
binary_op
用二元函数对象binary_op作为参数,执行其后返回一个结果值。它可以是一个函数或对象内的类重载operator()。

程序示例:

    1. /*******************************************************************
    2. * Copyright (C) Jerry Jiang
    3. *
    4. * File Name   : transform .cpp
    5. * Author      : Jerry Jiang
    6. * Create Time : 2012-4-29 22:22:18
    7. * Mail        : jbiaojerry@gmail.com
    8. * Blog        : http://blog.csdn.net/jerryjbiao
    9. *
    10. * Description : 简单的程序诠释C++ STL算法系列之十八
    11. *               变易算法 : 区间元素交换 transform
    12. *
    13. ******************************************************************/
    14. #include <iostream>
    15. #include <algorithm>
    16. #include <vector>
    17. using namespace std;
    18. int op_increase (int i) { return ++i; }
    19. int op_sum (int i, int j) { return i+j; }
    20. int main () {
    21. vector<int> first;
    22. vector<int> second;
    23. vector<int>::iterator it;
    24. // set some values:
    25. for (int i=1; i<6; i++) first.push_back (i*10); //  first: 10 20 30 40 50
    26. second.resize(first.size());     // allocate space
    27. transform (first.begin(), first.end(), second.begin(), op_increase);
    28. // second: 11 21 31 41 51
    29. transform (first.begin(), first.end(), second.begin(), first.begin(), op_sum);
    30. //  first: 21 41 61 81 101
    31. cout << "first contains:";
    32. for (it=first.begin(); it!=first.end(); ++it)
    33. cout << " " << *it;
    34. cout << endl;
    35. return 0;
    36. }

A+B for Matrices 及 C++ transform的用法的更多相关文章

  1. UI中 frame 与 transform的用法与总结

    在iOS中,我们是不可以直接访问控件中frame的结构体的成员的,因此我们需要分三步来改变一个UI控件的位置,大小 一.frame用法 frame的结构体类型为: struct CGRect { CG ...

  2. css3中transform的用法

    transform:rotate旋转deg #box1{ -moz-transform:rotate(10deg); -webkit-transform:rotate(10deg); }transfo ...

  3. HIVE Transform using 用法

    select TRANSFORM(*, *, *) using 'python filter.py' as (*, *, *) from t_1 HIVE支持pipe操作,将select出来的字段,用 ...

  4. CSS3转换(transform)基本用法介绍

    一个炫酷的网页离不开css的transform.transition.animation三个属性,之前一直没有涉及到这块内容,刚好最近要做一个相关东西,趁此机会好好学一学这三个属性. 一.功能 实现元 ...

  5. STL常用遍历算法for_each和transform的比较

    for_each()和transform()算法比较 1)STL 算法 – 修改性算法  for_each()  copy()  copy_backward()  transform()  merge ...

  6. css变换transform 以及 行内元素的一些说明

    变换transform的用法比较简单:[变换其实和普通的css属性,如color等没什么区别,可以为变换应用过渡或动画,就像其他普通css属性一样]#test { transform: transla ...

  7. KCF:High-Speed Tracking with Kernelized Correlation Filters 的翻译与分析(一)。分享与转发请注明出处-作者:行于此路

    High-Speed Tracking with Kernelized Correlation Filters 的翻译与分析 基于核相关滤波器的高速目标跟踪方法,简称KCF 写在前面,之所以对这篇文章 ...

  8. HTML页面的动画的制作及性能

    原文:HTML页面的动画的制作及性能 WEB页面的动画的制作及性能 简介 目前WEB页面做动画的方式大的分两种1.JS间隔时间不断修改元素属性值,这也是CSS3出来前常用的做法,貌似也是唯一的做法.2 ...

  9. css3 2d转换3d转换以及动画的知识点汇总

    css3 2d转换 2d转换的方法: 1.移动 translate(x, y) 可以改变元素的位置,x.y可为负值: 2.缩放 scale(x, y) 可以对元素进行水平和垂直方向的缩放,x.y的取值 ...

随机推荐

  1. ajax:serialize() 获取表单集合

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 【解惑】Java动态绑定机制的内幕

    在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto ...

  3. OpenGL基础渲染

    客户端-服务器 客户端是存储在CPU存储器中的,并且在应用程序中执行(或者驱动程序),驱动程序将渲染命令和数据组合起来,发动到服务器执行.服务器和客户机在功能上是异步的,他们是各自独立的软件模块或者硬 ...

  4. ES6入门之set和map

    Set ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化. // 例一 var set = ne ...

  5. python 调用 C++ code

    本文以实例code讲解python 调用 C++的方法. 1. 如果没有参数传递从python传递至C++,python调用C++的最简单方法是将函数声明为C可用函数,然后作为C code被pytho ...

  6. 基于EntityFramework的权限的配置和验证

    1.   概要 本文主要介绍公司现有系统框架的权限体系,和一些待扩展功能的说明.目前该权限体系基于角色构建(RBAC),原则上,系统中不允许出现对用户.组织等其他对象指派权限的情况. 2.   权限分 ...

  7. spring mvc 中文乱码 post与get的方法解决

    spring mvc表单提交中文参数乱码问题 今天测试spring mvc  ,中文乱码,在web.xml中加上 <filter> <filter-name>encodingF ...

  8. 浅谈Linux下的五种I/O模型

     一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer.如下图所 ...

  9. Android控件系列之CheckBox

    学习目的: 1.掌握在Android中如何建立CheckBox 2.掌握CheckBox的常用属性 3.掌握CheckBox选中状态变换的事件(监听器) CheckBox简介: CheckBox和Bu ...

  10. asp开发微信扫码支付

    这个任务已经给了.现在正在学习开发中.主要注意的是2点. 1:返回参数的验证. 2:通知后业务处理和处理后返回财付通.大部分操作,api中已经处理好. 现在需要的业务逻辑部分. 需要正确3个参数  r ...