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

简介:  使用C++风格的数组,不需要管理内存。 array要注意不要溢出,因为它是栈上开辟内存. array适用于任何类型 #include<iostream> #include<array> #include<vector>   //C++的标准库 #include<string

  1. 使用C++风格的数组,不需要管理内存。

  2. array要注意不要溢出,因为它是栈上开辟内存.

  3. array适用于任何类型

#include<iostream>

#include<array>

#include<vector>   //C++的标准库

#include<string>   //C++字符串

#include <stdlib.h>

 

using  std::array; //静态数组,栈上

using std::vector; //动态数组,堆上

using std::string;

 

//使用C++风格数组不需要管理内存。

//array注意不要栈溢出

//array适用于任何类型

 

void main()

{

    array<int, 5> myint1 = { 1, 2, 3, 4, 5 };

    array<int, 5> myint2 = { 11, 12, 13, 14, 15 };

    array<int, 5> myint3 = { 21, 22, 23, 24, 25 };

    //  array<array<int,5>, 3> myint = {myint1,myint2,myint3};

    array<array<int, 5>, 3> myint = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

    for (int i = 0; i < myint.size(); i++)//数组大小

    {

        for (int j = 0; j < myint1.size(); j++)

        {

            std::cout << "  " << myint[i][j];

        }

        std::cout << "\n";

    }

 

    std::cin.get();

}

  1. vector:动态字符串数组

#include<iostream>

#include<array>

#include<vector>//C++的标准库

#include<string>//C++字符串

#include <stdlib.h>

 

using  std::array;//静态数组,栈上,

using std::vector;//动态数组,堆上,

using std::string;

 

//使用C++风格数组不需要管理内存。

//array注意不要栈溢出

//array适用于任何类型

 

void main()

{

    vector <string>  string1;//动态字符串数组

    //可以反复利用

    string1.push_back("notepad");

    string1.push_back("calc");

    string1.push_back("mspaint");

    string1.pop_back();//删除一个

    //string1.clear();//清空

    for (int i = 0; i < string1.size(); i++)//遍历动态数组

    {

        system(string1[i].c_str());

    }

 

    system("pause");

}

5.通过iterator关键字进行过迭代

#include<iostream>

#include<array>

#include<vector>   //C++的标准库

#include<string>   //C++字符串

#include <stdlib.h>

 

using  std::array; //静态数组,栈上

using std::vector; //动态数组,堆上

using std::string;

 

void main()

{

    vector <string>  string1;//动态字符串数组

    string1.push_back("notepad");

    string1.push_back("calc");

    string1.push_back("mspaint");

 

    vector<string>::iterator ibegin, iend;//迭代器

    ibegin = string1.begin();  //数据起始点

    iend = string1.end();      //结束

    for (;ibegin != iend;ibegin++)

    {

        string tempstr = *ibegin;   //获取指针指向的数据

        system(tempstr.c_str());    //执行指令

    }

 

    system("pauese");

}

6.正逆向迭代数组

#include<iostream>

#include<array>

#include<vector>   //C++的标准库

#include<string>   //C++字符串

#include <stdlib.h>

 

using  std::array; //静态数组,栈上

using std::vector; //动态数组,堆上

using std::string;

 

void main()

{

    array<int, 5> myint = { 1, 2, 3, 4, 5 };

    array<int, 5>::iterator ibegin, iend;//正向迭代器

    ibegin = myint.begin();

    iend = myint.end();

    while (ibegin != iend)

    {

        std::cout << *ibegin << std::endl;

        ibegin++;

    }

    std::cout << "----------" << std::endl;

    array<int, 5>::reverse_iterator rbegin, rend;

    rbegin = myint.rbegin();

    rend = myint.rend();

    while (rbegin != rend)

    {

        std::cout << *rbegin << std::endl;

        rbegin++;

    }

    std::cin.get();

}

7.反向迭代器

#include<iostream>

#include<array>

#include<vector>   //C++的标准库

#include<string>   //C++字符串

#include <stdlib.h>

 

using  std::array; //静态数组,栈上

using std::vector; //动态数组,堆上

using std::string;

 

void main()

{

    vector<string> string1; //动态字符串数组

    string1.push_back("notepad");

    string1.push_back("calc");

    string1.push_back("mspaint");

    //反向迭代器

    vector<string>::reverse_iterator rbegin = string1.rbegin();

    vector<string>::reverse_iterator rend = string1.rend();

    //rend最后不指向数据,指向数据的结尾的下一个节点

    //当使用下面的方法时,只打印了记事本,计算器

    rend--;

    A:if (rbegin != rend)

    {

        system((*rend).c_str());  //执行指令

        //rbegin++;

        rend--;

        goto A;

    }

}

8.lambda表达式,不仅仅适用与array,也适用于vector

#include<iostream>

#include <vector>

#include <algorithm>  //算法 lambda表达式,不仅仅适用于array,也适用于vector

 

void main()

{

    std::vector<int> myvector;

    myvector.push_back(11);

    myvector.push_back(22);

    myvector.push_back(33);

    myvector.push_back(3);

    myvector.push_back(4);

    myvector.push_back(5);

    int res = 0;  //结果

    //&res直接操作一个变量,res等价于返回值,x代表参数,

    //每次充当迭代器指向的元素,大括号就是代码

    std::for_each(myvector.begin(), myvector.end(), [&res](int x){res += x; });

    std::cout << res;

    std::cin.get();

}

运行结果是:

9.vector的增删改查

#include<iostream>

#include <vector>

#include <algorithm>  //算法 lambda表达式,不仅仅适用于array,也适用于vector

 

void main()

{

    //分配5个空间,默认初始化为0

    std::vector<int> myvector(5);

    myvector.push_back(1);

    myvector.push_back(11);

    myvector.push_back(111);

    myvector.push_back(1111);

    myvector.push_back(2);

    //弹出一个元素,删除最后一个

    myvector.pop_back();

    //插入

    myvector.insert(myvector.begin() + 1,999);

    //根据迭代器的位置

    myvector.erase(myvector.begin() + 5);

    //myvector.clear(); //删除所有元素

    for (int i = 0; i < myvector.size();i++)

    {

        if (1)

        {

            //查询,修改

        }

        std::cout << myvector.at(i) << std::endl;

    }

    system("pause");

}

10.vector中的元素也是vector

#include<iostream>

#include <vector>

#include <algorithm>  //算法 lambda表达式,不仅仅适用于array,也适用于vector

 

void main()

{

    //可以实现动态无规则数组管理

    std::vector<int> myvector1;

    myvector1.push_back(12);

    myvector1.push_back(13);

    myvector1.push_back(14);

 

    std::vector<int> myvector2;

    myvector2.push_back(22);

 

    std::vector<int> myvector3;

    myvector3.push_back(32);

    myvector3.push_back(37);

 

    std::vector<std::vector<int>> allvecor;

    allvecor.push_back(myvector1);

    allvecor.push_back(myvector2);

    allvecor.push_back(myvector3);

    for (int i = 0; i < allvecor.size();i++)

    {

        for (int j = 0; j < allvecor[i].size();j++)

        {

            std::cout << "  " << allvecor[i][j];

        }

        std::cout << "\n";

    }

 

    std::cin.get();

}

11.C++中的数组可以直接赋值

#include <iostream>

#include <array>

#include <string>

#include <stdlib.h>

 

void main()

{

    double db[4] = { 1.1, 2.2, 3.3, 4.4 };

    //std::array数据类型,double元素类型,4个数

    std::array<double, 4> dbnew1 = { 10.1, 10.2, 10.3, 10.4 };

    //可以实现数组之间整体操作

    std::array<double, 4> dbnew2 = dbnew1;

    for (int i = 0; i < 4; i++)

    {

        std::cout << db[i] << "   " << dbnew1[i] << "    " << dbnew2[i] << std::endl;

    }

    std::cin.get();

}

运行结果:

12.array的字符串

#include <iostream>

#include<array>

#include<string>

#include<stdlib.h>

 

void main()

{

    std::array<std::string, 5> string1 = { "calc", "notepad", "tasklist", "mspaint", "write" };

    for (int i = 0; i < 5; i++)

    {

        std::cout << string1[i] << std::endl;

        system(string1[i].c_str());

    }

    std::cin.get();

}

12.C++可以加操作

#include <iostream>

#include<array>

#include<string>

#include<stdlib.h>

 

void main()

{

    std::string str1 = "task";

    std::string str2 = "list";

    std::string str3 = str1 + str2;

    system(str3.c_str());

    std::cin.get();

}

13.new的高级,缓冲区

#include<iostream>

#include<new>

const int buf(512);//限定一个常量整数512

int N(5);//数组的长度

char buffer[buf] = { 0 };//静态区

 

//p1,p3,p5作为指针变量在栈区,存储的地址指向堆区

//手动释放内存

 

//p2,p4,p6作为指针变量在栈区,存储的地址在静态区。缓冲区。

//自动释放内存,用于分配用完了就不会再用的数据

//避免内存泄漏,自动释放内存。牺牲了内存访问独立性,

using namespace std;

 

void main()

{

    double *p1, *p2;

 

    std::cout << "\n\n\n";

    p1 = new double[N];//分配内存,N个元素的大小

    p2 = new (buffer)double[N];//指定区域分配内存

    for (int i = 0; i < N; i++)

    {

        p1[i] = p2[i] = i + 10.8;//对于数组初始化

        std::cout << "p1===   " << &p1[i] << "  " << p1[i];

        std::cout << "   p2===  "<< &p2[i] << "  " << p2[i] << std::endl;

    }

 

    double *p3, *p4;

    std::cout << "\n\n\n";

    p3 = new double[N];//分配内存,N个元素的大小

    p4 = new (buffer)double[N];//指定区域分配内存

 

    for (int i = 0; i < N; i++)

    {

        p3[i] = p4[i] = i + 10.8;//对于数组初始化

        std::cout << "p3===   " << &p3[i] << "  " << p3[i];

        std::cout << "   p4===  "<< &p4[i] << "  " << p4[i] << std::endl;

    }

 

    double *p5, *p6;

    std::cout << "\n\n\n";

    p5 = new double[N];//分配内存,N个元素的大小

    p6 = new (buffer)double[N];//指定区域分配内存

 

    for (int i = 0; i < N; i++)

    {

        p6[i] = p5[i] = i + 10.8;//对于数组初始化

        std::cout << "p5===   " << &p5[i] << "  " << p5[i];

        std::cout << "   p6===  "<< &p6[i] << "  " << p6[i] << std::endl;

    }

 

    std::cin.get();

}

14.多元数组

#include <iostream>

#include <map>

 

//void在参数内部意味着参数为空,不写也意味着为空

void main(void)

{

    int int1 = 10;

    double double1 = 99.8;

    char ch = 'A';

    char *str = "hellochina";

    std::tuple<int, double, char, const char *> mytuple(int1, double1, ch, str);

    const int num = 3;

    auto data0 = std::get<0>(mytuple);

    auto data1 = std::get<1>(mytuple);

    auto data2 = std::get<2>(mytuple);

    auto data3 = std::get<num>(mytuple);//下标只能是常量

    std::cout << typeid(data3).name() << std::endl;

    decltype(data0) dataA;   //获取数据类型再次创建

    //mytuple.swap(mytuple); array  vector都有交换的功能

    std::cout << data0 << "  " << data1 << "  " << data2 << "   " << data3 << std::endl;

    std::cin.get();

}

//tuple必须是一个静态数组

//配合vector,array

 

目录
相关文章
|
5月前
|
C语言 C++
【实战指南】 C/C++ 枚举转字符串实现
本文介绍了在C/C++中实现枚举转字符串的实用技巧,通过宏定义与统一管理枚举名,提升代码调试效率并减少维护错误。
344 51
|
6月前
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
209 0
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
333 5
|
10月前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
249 16
|
12月前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
|
存储 编译器 程序员
C++类型参数化
【10月更文挑战第1天】在 C++ 中,模板是实现类型参数化的主要工具,用于编写能处理多种数据类型的代码。模板分为函数模板和类模板。函数模板以 `template` 关键字定义,允许使用任意类型参数 `T`,并在调用时自动推导具体类型。类模板则定义泛型类,如动态数组,可在实例化时指定具体类型。模板还支持特化,为特定类型提供定制实现。模板在编译时实例化,需放置在头文件中以确保编译器可见。
166 11
|
缓存 网络协议 API
C/C++ StringToAddress(字符串转 boost::asio::ip::address)
通过上述步骤和示例代码,你可以轻松地在C++项目中实现从字符串到 `boost::asio::ip::address`的转换,从而充分利用Boost.Asio库进行网络编程。
374 0
|
编译器 C语言 C++
C/C++数字与字符串互相转换
C/C++数字与字符串互相转换
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
|
10月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。

热门文章

最新文章

  • 1
    Java 中数组Array和列表List的转换
    589
  • 2
    JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
    552
  • 3
    通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据和性能优化,reduce()的使用详解(附实际应用代码)
    1324
  • 4
    通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
    390
  • 5
    通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
    243
  • 6
    多维数组操作,不要再用遍历循环foreach了!来试试数组展平的小妙招!array.flat()用法与array.flatMap() 用法及二者差异详解
    157
  • 7
    别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
    181
  • 8
    Array.forEach实战详解:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提高Array.forEach的性能
    126
  • 9
    深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
    441
  • 10
    JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
    823