原文来自: https://shendrick.net/Coding Tips/2015/03/15/cpparrayvsvector.html @Seth Hendrick

Original article: https://shendrick.net/Coding Tips/2015/03/15/cpparrayvsvector.html @Seth Hendrick

C-Style 数组

赋值

int myArray[3] = {1, 2, 3};

数组与指针

a[1]等价于*(a+1)

std::cout << std::boolalpha << (myArray[0] == *myArray) << std::endl;
std::cout << std::boolalpha << (myArray[1] == *(myArray + 1) << std::endl; // Outputs:
// true
// true

数组大小

int myArray[5] = {1, 2, 3, 4, 5};
size_t arraySize = sizeof(myArray) / sizeof(int);
std::cout << "C-style array size: " << arraySize << std::endl;
// Outputs:
// C-style array size: 5
#include <iostream>

void printSize(int someArray[5]) {
std::cout << sizeof(someArray)/sizeof(int) << std::endl;
} int main() {
int myArray[5] = {1, 2, 3, 4, 5};
printSize(myArray);
} // Outputs:
// 2

第二个例子中, 函数没有返回正确的数组大小. 这是因为数组作为输入参数时, 传入的是一个size_t大小的指针, 在具体机器上大小可能为8字节, 而int类型大小是4个字节, 因为第二个例子相当于sizeof(size_t) / sizeof(int), 输出结果为2.

遍历循环

与上面一个小节类似, 在同一个作用范围内, 数组可以用C++11的遍历循环,

int main() {
int myArray[5] = {1, 2, 3, 4, 5};
for (int &i : myArray) {
std::cout << i << ", " << std::endl;
}
}

但是当数组被传入其他函数作为变量时, 遍历循环失效

#include <iostream>

void printElements(int someArray[5]) {
for (int &i : someArray) {
std::cout << i << ", " << std::endl;
}
} int main() {
int myArray[5] = {1, 2, 3, 4, 5};
printElements(myArray);
}

原因还是一样, 被传入的是指针.

std::array

std::array是一个包装后的C数组, 在编译的时候必须确定数组大小.

声明数组

#include <array>
#include <iostream> void printElements(const std::array<int, 5> &someArray) {
for (const int &i : someArray) {
std::cout << i << ", " << std::endl;
} std::cout << "Size: " << someArray.size() << std::endl;
} int main() {
std::array<int, 5> myArray = {1, 2, 3, 4, 5};
printElements(myArray);
} // Outputs:
// 1,
// 2,
// 3,
// 4,
// 5,
// Size: 5

std::vector

std::array是C数组的封装, std::vector则完全不同于原来的C数组, 是heap上的动态数组, 数组大小在编译的时候可以不确定.

std::array可以看成如此封装

int a[5];

std::vector则是

int *a = net int[5];

C++ Arrays, std::array, std::vector 总结的更多相关文章

  1. C++中的数组array和vector,lambda表达式,C字符串加操作,C++中新类型数组(数组缓存),多元数组,new缓冲

     使用C++风格的数组.不须要管理内存. array要注意不要溢出,由于它是栈上开辟内存. array适用于不论什么类型 #include<iostream> #include< ...

  2. std::array,std::vector,基于范围的for循环

    std::array除了有传统数组支持随机访问.效率高.存储大小固定等特点外,还支持迭代器访问.获取容量.获得原始指针等高级功能.而且它还不会退化成指针T *给开发人员造成困惑. for( 元素名变量 ...

  3. C++ std::array

    std::array template < class T, size_t N > class array; Code Example #include <iostream> ...

  4. LeetCode 26 Remove Duplicates from Sorted Array [Array/std::distance/std::unique] <c++>

    LeetCode 26 Remove Duplicates from Sorted Array [Array/std::distance/std::unique] <c++> 给出排序好的 ...

  5. C++语言中std::array的神奇用法总结,你需要知道!

    摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此, ...

  6. c++编译错误C2971:"std::array":array_size:包含非静态存储不能用作废类型参数;参见“std::array”的声明

    在Qt5中这段代码编写有两种方式:一个编译成功,一个失败 成功版本: static constexpr size_t block_size = 0x2000;//8KB static constexp ...

  7. std::array中的std::get<n>()

    模板函数std::get<n>()是一个辅助函数,它能够获取到容器的第 n 个元素.模板参数的实参必须是一个在编译时可以确定的常量表达式,编译时会对它检查. get<n>()模 ...

  8. 将std::array转换成std::tuple

    template<typename Array, std::size_t... Index> decltype(auto) array2tuple_impl(const Array& ...

  9. C++ std::array 基本用法

    #include <iostream> #include <string> #include <array> using namespace std; // htt ...

随机推荐

  1. 使用ssh-agent管理私钥

    使用ssh-agent的好处: 如果有多台远程服务器与多个私钥文件,ssh-gent将会尝试使用不同的私钥文件建立连接,直至成功 假如有 A.B.C 三台服务器,A是控制节点,A可以直接登录B,但是无 ...

  2. cocos2dx基础篇(1) Cocos2D-X项目创建

    已经入行工作半年多时间了,以前都是把这些东西记录在有道云上面的,现在抽出些时间把以前的笔记腾过来. 具体的环境配置就不用说了,因为现在已经是2018年,只需要下载对应版本解压后就能使用,不用再像多年前 ...

  3. 【神经网络与深度学习】Caffe使用step by step:caffe框架下的基本操作和分析

    caffe虽然已经安装了快一个月了,但是caffe使用进展比较缓慢,果然如刘老师说的那样,搭建起来caffe框架环境比较简单,但是完整的从数据准备->模型训练->调参数->合理结果需 ...

  4. SQL修改数据表字段长度

    alter table m_Assysn_t nocheck CONSTRAINT allAlter Table m_Assysn_t ALTER column ppid VARCHAR(150)al ...

  5. mac下mysql重置密码及使用用户和密码登陆

    回车后 登录管理员权限 sudo su回车后输入以下命令来禁止mysql验证功能 ./mysqld_safe --skip-grant-tables &回车后mysql会自动重启(偏好设置中m ...

  6. js实现回车键搜索

    前端关键代码: <input type="text" onkeydown="entersearch()" class="form-control ...

  7. python简介与简单入门

    1.计算机基础 计算机组成: 输入输出设备内. 存储器 .cpu .电源 .显卡 中央处理器(cpu) 处理各种数据 相当于人的大脑 内存 存储数据 相当于临时记忆 硬盘 存储数据 相当于人的永久记忆 ...

  8. Jquery复习(六)之remove()易忘点和trigger()

    过滤被删除的元素 jQuery remove() 方法也可接受一个参数,允许您对被删元素进行过滤. 该参数可以是任何 jQuery 选择器的语法. 下面的例子删除 class="italic ...

  9. AWS EC2 搭建 Hadoop 和 Spark 集群

    前言 本篇演示如何使用 AWS EC2 云服务搭建集群.当然在只有一台计算机的情况下搭建完全分布式集群,还有另外几种方法:一种是本地搭建多台虚拟机,好处是免费易操控,坏处是虚拟机对宿主机配置要求较高, ...

  10. JVM内存结构思维导图