分别以函数返回值方式和参数传引用方式测试了vector、map两种容器,代码如下:

 // testContainer.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <iostream>
#include <vector>
#include <map>
#include <chrono>
using namespace std;
vector<int> funcVec1(){
vector<int >vec;
for (int i = ; i < ; ++i){
vec.push_back(i);
}
return vec;
} void funcVec2(vector<int>&vec){
for (int i = ; i < ; ++i){
vec.push_back(i);
}
return;
} map<int, int>funcMap1(){
map<int, int>tmpMap;
for (int i = ; i < ; ++i){
tmpMap[i] = i;
}
return tmpMap;
} void funcMap2(map<int, int>&tmpMap){
for (int i = ; i < ; ++i){
tmpMap[i] = i;
}
} int _tmain(int argc, _TCHAR* argv[])
{
using namespace std::chrono;
steady_clock::time_point t1 = system_clock::now();
for (int i = ; i < ; ++i){
vector<int> vec1 = funcVec1();
}
auto t2 = std::chrono::system_clock::now();
//count输出时钟周期
cout << "return vec takes " << (t2 - t1).count()<<" tick count" << endl;
// duration_cast在chrono中,可以将时钟数转换为相应的时间间隔
cout << duration_cast<nanoseconds>(t2 - t1).count() << " nanoseconds" << endl;
cout << duration_cast<microseconds>(t2 - t1).count() << " microseconds" << endl;
cout << duration_cast<milliseconds>(t2 - t1).count() << " milliseconds" << endl;
cout << duration_cast<seconds>(t2 - t1).count() << " seconds" << endl;
cout << " --------------------------------" << endl;
vector<int> vec2;
for (int i = ; i < ; ++i){
funcVec2(vec2);
}
auto t3 = system_clock::now();
cout << "reference vec takes " << (t3 - t2).count() << " tick count" << endl;
cout << duration_cast<milliseconds>(t3 - t2).count() << " milliseconds" << endl;
cout << " --------------------------------" << endl;
for (int i = ; i < ; ++i){
map<int,int> tmpMap1 = funcMap1();
}
auto t4 = system_clock::now();
cout << "return map takes " << (t4 - t3).count() << " tick count" << endl;
cout << duration_cast<milliseconds>(t4 - t3).count() << " milliseconds" << endl;
cout << " --------------------------------" << endl;
map<int, int>tmpMap2;
for (int i = ; i < ; ++i){
funcMap2(tmpMap2);
}
auto t5 = system_clock::now();
cout << "reference map takes " << (t5 - t4).count() << " tick count" << endl;
cout << duration_cast<milliseconds>(t5 - t4).count() << " milliseconds" << endl;
return ;
}

输出结果:

在测试代码中,函数返回值是容器的执行速度比容器作为参数传递要慢的多。

可以看到返回容器的函数里,容器频繁的创建销毁。

容器作为参数传递是项目中常见做法,很少看到函数返回容器。原因就在此。

STL中的容器作为返回值的更多相关文章

  1. STL中的容器

    STL中的容器 一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist ...

  2. C++ STL 中 map 容器

    C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...

  3. STL中的容器介绍

    STL中的容器主要包括序列容器.关联容器.无序关联容器等. 一]序列容器 (1) vector vector 是数组的一种类表示,提供自动管理内存的功能,除非其他类型容器有更好满足程序的要求,否则,我 ...

  4. [C++]STL中的容器

    C++11 STL中的容器 一.顺序容器: vector:可变大小数组: deque:双端队列: list:双向链表: forward_list:单向链表: array:固定大小数组: string: ...

  5. 慕课网-Java入门第一季-7-3 Java 中无参带返回值方法的使用

    来源:http://www.imooc.com/code/1579 如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值 ...

  6. Java 中无参带返回值方法的使用

    如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果 在 c ...

  7. python中os.system()的返回值

    [python中os.system()的返回值] 如果第三方程序返回的是布尔型返回值,os.system会将true转为1,false转为0进行返回. 问题: /bin/xxx.py是一个返回码为1的 ...

  8. 算法求解中的变量、数组与数据结构(STL 中的容器)

    本质上算法都是对数据的操作,没有数据,没有存储数据的容器和组织方式,算法就是无源之水无本之木,就是巧妇也难为无米之炊.算法是演员,变量.数组.容器等就是舞台, 然后整个算法的处理流程,都是针对这些数据 ...

  9. C++ STL中常见容器的时间复杂度和比较和分析

    C++ STL中常见容器的时间复杂度 map, set, multimap, and multiset 上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种.不同操作的时间复杂度近似为: 插入: O( ...

随机推荐

  1. mybatis泛型(一)

    mybatis的确很方便,可以随意配置sql语句,并根据参数生成指定的sql,也可以根据查询结果生成指定对象 但是有一点非常恐怖,就是每个数据库表都必须有一个配置,等于在一个系统里做了很多重复的工作, ...

  2. CAFE: a computational tool for the study of gene family evolution

    1.摘要 摘要:我们提出了CAFE(计算分析基因家族进化),这是一个统计分析基因家族进化规模的工具.它使用随机的出生和死亡过程来模拟一个系统发育过程中基因家族大小的进化.对于一个特定的系统发育树,并给 ...

  3. Java学习笔记(十三):package关键字

  4. 分布式01-Dubbo基础背景

    分布式01-Dubbo基础 1-分布式基础理论 分布式系统是由一组通过网络进行通信.为了完成共同的任务而协调工作的计算机节点组成的系统.分布式系统的出现是为了用廉价的.普通的机器完成单个计算机无法完成 ...

  5. [leetcode]236. Lowest Common Ancestor of a Binary Tree二叉树最近公共祖先

      Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. Accordi ...

  6. java编译时出现——注:使用了未经检查或不安全的操作。注:有关详细信息,请使用 -Xlint:unchecked 重新编译

    网上说是泛型问题 private List<Product> products = new ArrayList<Product>(); 这种用法绝对没错!(因为是照着书写的)在 ...

  7. Java 深拷贝,浅拷贝

    一直听说这两个词,确实不知道代表啥意思?也不知道究竟要用来做什么?什么时候用到他们. 下面是从一篇博文种得到的解释: 浅复制(浅克隆) :被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他 ...

  8. Spark2.0学习(一)--------Spark简介

    官网对Spark的介绍 http://spark.apache.org/ Apache Spark™ is a unified analytics engine for large-scale dat ...

  9. JavaSE基础知识(5)—面向对象(5.1类和对象概念、创建及内存分配)

    一.类和对象的相关概念 1.面向对象和面向过程的理解 面向对象和面向过程都属于解决问题的思考方式.面向过程:以执行者的角度思考问题,侧重于“怎么做”,比较适合解决小型项目面向对象:以指挥者的角度思考问 ...

  10. java【基础】正则表达式

    1 字符串判断 java的正则使用的是Pattern以及Matcher来配合使用的. 如果只是用来判断输入的字符串是否符合格式,推荐使用Matcher的matches方法. public static ...