`
lunan
  • 浏览: 77976 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

我所用过的C++ 循环

 
阅读更多
/*

目标:在不太损失效率的情况下写最简洁最放心的循环

声明:随意写下的,有的功能还没实现,欢迎大家纠正补充。


① []类数组方式,实现简洁明了,代价也是显而易见:不检查越界情况。
   如果不嫌规范也可以这样定义循环变量vector < shared_ptr<CWorker> >::size_type i=0;
   at(int index);直接返回该位置上的记录,而且越界的话会检查的。此种方式归为第一类。

② 最常见

③ 宏BOOST_TYPEOF和BOOST_AUTO一样 可以自动推断表达式类型,书上说对于自定义类型要“注册”,但我发现没注册一样用。
   个人觉得比起typedef 这种随用随定义蛮好,尤其是很变态长的声明,能少写一点是一点。
   有个问题是如何 加上 const 有待解决。
   BOOST_TYPEOF( vecW.begin() ) w; 是个空指针,程序会崩溃,有待解决。

④ 声明下个人原因用transform的优先级最低。且用bind 取代标准库配接器,但是transform的那个bind我没有写出来。
   google有会也没写出来,有待解决。

⑤ 智能指针bind 时要用*_1

⑥ 很多人对boost::BOOST_FOREACH不以为然,for简单的封装。
   用习惯了它反而觉得前三种怪异,循环集合为何要定义变量?

⑦ 同上
*/

#include "stdafx.h"

#include <iostream>
#include <string>

#include <vector>
#include <algorithm>
#include <functional>

#include "boost/lambda/lambda.hpp"
#include "boost/lambda/bind.hpp"

#include "boost/assign.hpp"
#include "boost/typeof/typeof.hpp"
#include "boost/foreach.hpp"
#include <boost/shared_ptr.hpp>

#define foreach BOOST_FOREACH
#define auto_t  BOOST_AUTO

using namespace boost;
using namespace boost::lambda;
using namespace std;

//④ transform 调用
template <class ty>
class nullify
{
public:
ty operator () ( ty &elem )
{
std::cout  << elem->m_name  << endl;
return elem;
}
};

//自定义类
struct CWorker
{  
CWorker( long ll,string ss)
:m_No     (ll)
,m_name   (ss)
{}
long   m_No     ;
string m_name   ;
};

int _tmain(int argc, _TCHAR* argv[])
{
std::vector< shared_ptr<CWorker> > vecW;
vecW = boost::assign::list_of(shared_ptr<CWorker>(new CWorker(1001,"1001")) )
     (shared_ptr<CWorker>(new CWorker(1002,"1002")) )
     (shared_ptr<CWorker>(new CWorker(1003,"1003")) )
     (shared_ptr<CWorker>(new CWorker(1004,"1004")) )
     (shared_ptr<CWorker>(new CWorker(1005,"1005")) );

//① 标准的循环如下 at()  
std::cout << " ----   [i]  循环   ----  \n";
for(unsigned i=0; i< vecW.size();++i )
{
std::cout << vecW[i]->m_name  << endl;
}
   
//② 标准的循环如下 at()
std::cout << " ----   迭代器  循环   ----  \n";
vector < shared_ptr<CWorker> >::const_iterator ww = vecW.begin();
for (;ww != vecW.end(); ++ww)
{
       std::cout  << (*ww)->m_name  << endl;
}

//③ 迭代器的方式
std::cout << " ----  迭代器 循环(BOOST_TYPEOF)  ---- \n";
BOOST_TYPEOF( vecW.begin() ) w;
//for (;w != vecW.end(); ++w)
//{  
// std::cout  << (*w)->m_name  << endl;
//}


//④ transform 循环
std::cout << " ----  transform 循环  ---- \n";
std::transform(vecW.begin(),vecW.end(),vecW.begin(),
           nullify< shared_ptr<CWorker> >() );

    //⑤ for_each 的方式
std::cout << " ---- for_each 循环 ---- \n";
std::for_each(vecW.begin(),vecW.end(),
          std::cout << bind(&CWorker::m_name ,*_1)<< '\n');

//⑥ BOOST_FOREACH
std::cout << " ---- foreach 循环 ---- \n";
foreach(const shared_ptr<CWorker> &ww,vecW)
{
std::cout  << ww->m_name  << endl;
}

//⑦ BOOST_FOREACH + BOOST_AUTO
std::cout << " ---- BOOST_FOREACH + BOOST_AUTO 循环 ---- \n";
foreach(auto_t( ww,*vecW.begin()),vecW)
{
std::cout  << ww->m_name  << endl;
}

return 0;
}
分享到:
评论

相关推荐

    俄罗斯方块C++写的

    4. **游戏循环**:C++程序需要有一个主循环来处理游戏的运行,包括方块的下落、碰撞检测、得分计算等。 5. **事件处理**:C++可能需要借助如SDL、SFML或Allegro这样的图形库来处理用户输入,如键盘控制方块的旋转和...

    C++标准模板库编程实战-书中所用代码

    本资源"**C++标准模板库编程实战-书中所用代码**"显然是一个用于实践和学习STL的代码集合,可能包含了各种示例、练习和解决方案。下面,我们将深入探讨STL的核心组成部分,并结合提供的代码文件名,解析其中可能包含...

    达内c++ 课件 老师授课所用

    4. **语句**:程序的基本执行单元,如赋值语句、控制流语句(如`for`循环、`if`条件语句等)。 5. **函数**:C++ 中,函数是一组相关操作的集合,可以被多次调用。 6. **程序结构**:包括文件组织、包含头文件、...

    c++编写的拼图小游戏(含源代码)

    开发者需要加载音频文件,创建音乐对象,并设置播放参数,如音量和循环次数。在适当的时间调用播放函数,为游戏增添氛围。 步数记录是游戏过程中的关键数据,通常存储在一个变量中,并在每次移动后更新。为了实现...

    C++语言程序设计试题

    3. **控制结构**:涉及条件语句(if-else、switch-case)、循环(for、while、do-while)和跳转语句(break、continue)。这些结构用于控制程序的流程。 4. **函数**:C++中的函数可以看作是可重用的代码块。了解...

    [C++.核心思想] 中文版

    ● 所用的编程语言是一个C++子集。虽然将C++作为一门完美的教学语言还相去甚远,但其本身是一门十分注重实效的语言。在软件界中,C++是应用十分广泛的编程语言。在所有主要平台上都有便于使用的C++编程环境。特别是...

    C++作业.这个是作为平时练习所用的代码

    首先,C++中的基础概念包括变量、数据类型、运算符、流程控制(如if语句、switch语句、循环结构for、while、do-while)。这些构成了程序的基本框架。在练习中,我们需要熟练掌握它们的使用方法,并通过编写各种小...

    Visual C++ 6.0 程序设计案例教程.zip

    1. **C++基础**:首先,教程会介绍C++的基础语法,包括变量、数据类型、控制结构(如if-else,for,while循环)、函数、数组和指针等基本概念。 2. **面向对象编程**:Visual C++支持C++的面向对象特性,如类、对象...

    高斯滤波的c++代码实现

    一阶高斯滤波器和二阶高斯滤波器的主要区别在于它们所用的高斯核大小和复杂度。一阶高斯滤波通常使用较小的高斯核,例如3x3或5x5,计算相对简单,因此在处理速度上会更快。而二阶高斯滤波器可能使用更大的核,如7x7...

    Optimizing software in C++ An optimization guide

    开发者需要对所用平台有深入了解,并通过分析程序热点、选择合适的算法和数据结构、利用编译器特性等方式,才能编写出运行高效、响应迅速的软件。这本书为C++开发者提供了一个全面的指南,帮助他们构建性能更优的...

    c++ 猜数字游戏

    当玩家猜中数字时,系统会显示所用的时间,并根据游戏难度和用时给出评价。 #### 二、关键技术点 ##### 1. 随机数生成 - **函数**:`srand()` 和 `rand()` - `srand()` 函数用于设置随机数生成器的种子。通常...

    线程测试(C++初学者)

    描述中提到的“循环创建10000个线程”,这涉及到线程池的概念。线程池是一种管理线程资源的方法,它可以预先创建一定数量的线程,然后根据需要分配给任务。在C++中,虽然标准库没有内置线程池,但可以自定义实现。...

    C++_Primer_习题答案

    #### 习题1.1: 查看所用的编译器文档,了解它所用的文件命名规范。编译并运行本节的 main 程序。 **知识点说明**: - **C++ 文件类型**: - 在 C++ 中,通常涉及到两种类型的文件:**头文件**(Header Files) 和 **...

    用于计算C++程序或算法的运行时间,基于C++11.zip

    这时可以使用循环,并将每次运行的时间累加,最后除以循环次数得到平均值。 此外,C++11还引入了`auto`关键字,它可以根据初始化表达式的类型自动推导变量类型。在上面的例子中,我们用`auto`声明`start`和`end`,...

    MXNet C++ API (CUDA 8.0, win x64 , without cudnn)

    cuDNN是一个针对深度神经网络的库,它优化了CNN(卷积神经网络)、RNN(循环神经网络)和其他常见神经网络层的性能,通常能显著提升GPU上的计算效率。由于这个版本不包含cuDNN,因此在执行某些计算密集型任务时,...

    c++贪心算法 啊啊啊啊啊

    通过合理的算法设计,找到一种最优的找零方案,使得所用硬币的数量最少。 ### 二、贪心算法概述 贪心算法是一种在每个步骤中都采取当前状态下最好或最优的选择,从而希望最终得到全局最优解的算法策略。其核心思想...

    c++要知道的一些东西.pdf

    * libev :功能齐全,高性能的时间循环,轻微地仿效 libevent,但是不再像 libevent 一样有局限性,也修复了它的一些 bug。 * libevent :事件通知库 * libuv :跨平台异步 I/O。 音频 * FMOD :易于使用的跨平台...

    有关约瑟夫环(持有密码版和经典版)C++信息学竞赛13个文件

    此题所用的循环链表中不需要头结点,注意空表和非空表的界限。 基本要求二:用顺序表实现该问题。 实现提示 假设 i 为当前数组下标,n 为元素个数,用取模运算%可以实i+1==n 时,i 重新回到下标 0 。即(i+1)%n。 ...

    C++初学时 课件 (我们老师用的)

    描述中提到"C++初学时所用的课件,里面有能打开pdf的软件",暗示了课件包含PDF格式的教程或讲义,可能还附带了一个PDF阅读器——FoxitReader2.0Beta.exe,以便于查看和学习资料。Foxit Reader是一款流行且轻量级的...

    多表加密C++源代码(VS2010测试通过)

    总结来说,这个多表加密的C++实现结合了链表数据结构和循环密钥管理,提供了一种相对安全的加密手段。它展示了如何利用C++语言特性来设计和实现复杂的加密算法。如果你是一个C++初学者,这个源代码可以作为一个学习...

Global site tag (gtag.js) - Google Analytics