C++学习总结(九)——C++数组array vector tuple

本文总结了C++中的三种数组类型:array作为静态大小的栈上数组,vector则作为动态大小、内存连续的堆上数组,方便管理不规则数据。而tuple则是用于存储不同类型的静态数组,其元素类型一旦确定必须赋值相应类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++新类型数组:

1.array静态数组大小在定义时固定,位于栈上。  

#include<iostream>
#include<array>
#include<string>
void main1()
{
	double db[4] = {1.1,2.2,3.3,4.4};
	std::array<double,3> dbnew = { 10.1,10.2,10.3 };
	for (auto a:dbnew)
	{
		std::cout <<a<< std::endl;
	}
	std::cin.get();
}
void main()
{
	std::array<std::string, 4> string1 = { "calc","notepad","tasklist","ipconfig" };
	std::string str1, str2;
	std::string str3 = str1 + str2;
	for (auto a:string1)
	{
		std::cout << a << std::endl;
		system(a.c_str());
	}
	std::cin.get();
}

    

2. vector动态数组大小可变,位于堆上,可以通过接口函数进行删改。 用于管理不规则的树状结构,实现动态无规则,内存连续。 

3. tuple静态数组,包含不同的类型,类型固定后必须赋值为相应的类型。

#include<iostream>
#include<tuple>
#include<string>
using namespace std;
void main()
{
	tuple<string, int, double > mytuple("Guodong",18,9
### 定义不同数据类型的二维数组C++ 中,标准的二维数组通常由相同的数据类型组成。然而,在某些情况下可能需要创建包含不同类型元素的二维结构。为了实现这一点,可以利用 `std::tuple` 或者自定义类/结构体来模拟这种行为。 以下是几种常见的方法: #### 方法一:使用 `std::vector<std::variant>` 通过 `std::variant` 和 `std::vector` 的组合,可以在运行时存储多种数据类型。这种方法允许动态分配内存并支持不同的数据类型。 ```cpp #include <iostream> #include <vector> #include <variant> int main() { using VariantType = std::variant<int, double, std::string>; // 创建一个二维 vector 存储 variant 类型 std::vector<std::vector<VariantType>> mixedArray(2, std::vector<VariantType>(3)); // 赋值给混合类型数组 mixedArray[0][0] = 42; // int mixedArray[0][1] = 3.14; // double mixedArray[0][2] = "Hello"; // string mixedArray[1][0] = 7; mixedArray[1][1] = 2.718; mixedArray[1][2] = "World"; // 访问和打印元素 for (const auto& row : mixedArray) { for (const auto& elem : row) { std::visit([](auto&& arg) { std::cout << arg << &#39; &#39;; }, elem); } std::cout << &#39;\n&#39;; } return 0; // 返回语句遵循引用中的规则[^1] } ``` 此代码片段展示了如何使用 `std::variant` 来处理多态性的需求。它能够安全地存储多个预定义类型,并提供访问这些类型的机制。 --- #### 方法二:使用自定义结构体 另一种方式是设计一个包含所需字段的结构体或类,从而间接表示一个多类型二维数组。 ```cpp #include <iostream> #include <vector> #include <string> struct MixedData { int integer; double floatingPoint; std::string text; friend std::ostream& operator<<(std::ostream& os, const MixedData& data) { return os << "{Int: " << data.integer << ", Double: " << data.floatingPoint << ", String: " << data.text << "}"; } }; int main() { // 使用向量保存结构体实例 std::vector<std::vector<MixedData>> mixedArray(2); // 初始化第一个子数组 mixedArray[0].push_back(MixedData{42, 3.14, "Pi"}); mixedArray[0].push_back(MixedData{100, 2.718, "Euler"}); // 初始化第二个子数组 mixedArray[1].push_back(MixedData{7, 9.81, "Gravity"}); mixedArray[1].push_back(MixedData{50, 6.626e-34, "Planck"}); // 打印结果 for (const auto& row : mixedArray) { for (const auto& item : row) { std::cout << item << "\t"; } std::cout << &#39;\n&#39;; } return 0; // 遵循函数返回规则 } ``` 上述例子中,我们定义了一个名为 `MixedData` 的结构体用于封装各种数据类型。这种方式更加直观且易于维护。 --- #### 方法三:嵌套指针与联合体(Union) 如果性能至关重要而灵活性不是首要考虑因素,则可以通过联合体配合手动管理内存的方式来构建这样的二维数组。不过需要注意的是,联合体会覆盖其成员变量的空间,因此需谨慎操作以免引发未定义行为。 ```cpp union DataUnion { int iValue; double dValue; char cString[20]; DataUnion(int val):iValue(val){} DataUnion(double val):dValue(val){}; ~DataUnion(){} }; void print(DataUnion* ptr){ if(ptr->cString[0]!=0){ printf("%s\n",ptr->cString); }else{ printf("%.2f\n",(double)(ptr->dValue)); } } int main(){ DataUnion **array=new DataUnion*[2]; for(int r=0;r<2;++r){ array[r]=new DataUnion[3]; for(int c=0;c<3;++c){ switch(r+c%3){ case 0: array[r][c]=DataUnion(10*r+c);break; case 1: array[r][c]=DataUnion((r+c)*1.1);break; default: strcpy(array[r][c].cString,"Text"); } } } for(int r=0;r<2;r++){ for(int c=0;c<3;c++)print(&array[r][c]); puts(""); } for(int r=0;r<2;r++)delete[] array[r]; delete[] array; return 0;// 符合引用描述的要求 } ``` 尽管该方案效率较高,但由于缺乏安全性以及现代特性支持较少的原因并不推荐广泛采用。 --- ### 总结 以上三种技术各有优劣,具体选择取决于实际应用场景的需求。对于大多数情况而言,基于 STL 容器的方法既灵活又高效;而对于特殊场合下才应考虑低级手段如 union 结构等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值