字符串 向量 数组

一.  标准库类型string

1.   它表示可变长的字符序列,必须包含string头文件,命名在std中。

#include<string>

using std::string;

2.   getline(is, s) :从is中读取一行赋给s,返回is。遇到换行符就结束读取操作。第三个参数可以设置终止符

3.   size()函数返回的是一个string::size_type类型的值。string::size_type是一个无符号值而且能足够存下任何string对象的大小。

4.   字符字面值字符串字面值的区别。字符串字面值不是string对象。

5.   必须确保加法运算符(+)的两侧运算对象至少一个是string。

6.   string对象是字符序列,用范围for语句操作:

for( auto  c  :  str)

      cout<< c <<endl;

下标运算符[]操作string对象

 s[2] = toupper(s[2]);

 

二.  标准库类型vector

1.   它表示对象的集合。也称容器。是类模板而非类型。集合中每个对象都有一个与之对应的索引,索引用于访问对象。

2.   要使用vector,必须:

#include<vector>

Using std::vector;

3.   由于引用不是对象,则不存在引用的vector。

4.   向vector对象中添加元素:push_back()

5.   如果循环体内包含有向vector对象添加元素的语句,则不能使用范围for循环。范围for语句体内不应改变其所遍历序列的大小。

6.   使用范围for语句操作vector对象:

vector<int > v{1,2,3,4,5};

for(auto  & a : v)

      a*= a;//求元素值得平方。

7.   size()函数返回的是vector<int>::size_type.

8.    下标访问vector对象:

vector<unsigned>scores (11 ,0);

usignedgrade;

while(cin>> grade){

      if(grade <=100)

            ++scores[grade/10];}

Vector对象以及string对象的下标运算符可用于访问已存在的元素而不能用于添加元素。

三.  迭代器

1.   迭代器可以访问某个元素,也能从一个元素移到另一个元素。

2.   begin成员返回指向第一个元素的迭代器;

end成员返回指向容器或string的尾元素的下一个位置(一个本部存在的尾后元素)的迭代器。

若容器为空,则begin和end返回的是同一个迭代器。

 for(auto it = s.begin(); it != s.end(); ++it)

      *it= toupper(*it);

3.iter->men与(*iter).men等价。

4.迭代器类型:vector<int>::iterator it;

                            string::iteratorit2;

                            vector<int>::const_iteratorit3;

                            string::const_iteratorit4;

如果vector或string对象是个常量,则只能用const_iterator;如果不是常量,则可以用iterator或者const_iterator都可。

5.c++11新特性:cbegincend,不论对象是不是常量都返回const_iterator。

6.两迭代器相减所得两迭代器距离,类型是difference_type的带符号整数型。

 

四.  数组

1.   定义数组时必须指定数组类型,不允许使用auto关键字去推断类型。不存在引用的数组

2.   字符串字面值的结尾处有一个空字符’\0’.

3.   不允许将数组的内容拷贝给其他数组作为其初始值。

int a[]={1.2.3};

 int a2[] = a;//错误

4.   指针的数组: int *ptr[10];//含有10个整数指针的数组

数组的指针:int (*ptr)[10] = &arr;//指向含有10个整数的数组。

5.   下标访问数组元素,下标类型为size_t与机器相关的无符号类型。在cstddef头文件中定义了size_t.

6.   范围for()遍历数组元素。

7.   使用数组的使用编译器会把它转化为指针

使用取地址符得到该元素的指针。

String  *p2 = num等价于p2 = &num[0];

8.   当使用decltype关键字时不会转化为指针,decltype(ia)返回的是数组。

9.   标准库函数beginend:这两个函数与容器中的两个同名成员函数类似,不过数组不是类型,所以这两个函数不是成员函数。这两个函数定义在iterator头文件中,int  *beg = begin(arr)。

10. 两个指针相减的结果是ptrdiff_t的标准库类型。ptrdiff_t是定义在cstddef头文件中的机器相关的类型。

11. C标准库string函数:strlen(p),strcmp(s1,s2),strcat(s1,s2),strcpy(s1,s2),定义在cstring头文件中,传入此函数的指针必须以空字符结束的数组。

 

<think>我们注意到用户的问题是关于如何在MATLAB中定义字符向量数组。根据引用[1]和[2],MATLAB推荐使用字符串数组,但用户明确要求定义字符向量数组(即字符数组或字符向量元胞数组)。因此,我们将介绍两种定义字符向量数组的方法:字符数组(二维字符数组)和字符向量元胞数组(一维元胞数组,每个元胞包含一个字符向量)。 ### 定义字符向量数组的方法 #### 方法1:定义字符数组(二维字符数组) 字符数组要求每行字符数相同(不足的部分用空格填充)。例如: ```matlab % 定义字符数组(每行自动填充空格至最长字符串的长度) charArray = ['MATLAB '; 'Python '; 'C++ '; 'Java ']; % 或者使用char函数,可以自动填充空格 charArray = char('MATLAB', 'Python', 'C++', 'Java'); ``` 访问第i个字符串(即第i行): ```matlab firstStr = charArray(1, :); % 返回 'MATLAB '(注意末尾有空格) thirdStr = charArray(3, :); % 返回 'C++ ' ``` 注意:返回的是字符向量(char类型),末尾可能有填充的空格,可以使用`deblank`去除末尾空格: ```matlab firstStr = deblank(charArray(1, :)); % 'MATLAB'(无末尾空格) ``` #### 方法2:定义字符向量元胞数组 元胞数组允许每个元素是不同长度的字符向量。例如: ```matlab % 直接创建字符向量元胞数组 cellArray = {'MATLAB', 'Python', 'C++', 'Java'}; % 或者使用cell函数预分配,然后赋值 cellArray = cell(1,4); cellArray{1} = 'MATLAB'; cellArray{2} = 'Python'; cellArray{3} = 'C++'; cellArray{4} = 'Java'; ``` 访问第i个字符向量: ```matlab firstStr = cellArray{1}; % 返回 'MATLAB' thirdStr = cellArray{3}; % 返回 'C++' ``` 注意:使用花括号`{}`进行索引获取内容,使用圆括号`()`索引获取子元胞数组。 ### 完整示例 ```matlab % 示例1:字符数组 charArray = char('Apple', 'Banana', 'Cherry'); disp('字符数组:'); disp(charArray); % 访问第二行 secondFruit = deblank(charArray(2, :)); disp(['第二个水果: ', secondFruit]); % 示例2:字符向量元胞数组 cellArray = {'Apple', 'Banana', 'Cherry'}; disp('字符向量元胞数组:'); disp(cellArray); % 访问第三个元素 thirdFruit = cellArray{3}; disp(['第三个水果: ', thirdFruit]); ``` ### 重要区别 - **字符数组**:适合处理长度相近的字符串,但必须填充空格以保证矩阵形状规则。 - **字符向量元胞数组**:适合处理长度差异大的字符串,每个元素独立。 ### 建议 根据引用[1][^1]和引用[2][^2],MATLAB推荐使用字符串数组(`string`类型)代替字符向量元胞数组,因为字符串数组功能更强大且易于使用。可以使用`string`函数将字符向量元胞数组转换为字符串数组: ```matlab strArray = string(cellArray); ``` ### 相关问题 1. 如何将字符数组转换为字符串数组? 2. 字符向量元胞数组字符串数组在性能上有何差异? 3. 如何在不使用循环的情况下修改字符向量元胞数组中的多个元素?</think>### MATLAB 定义字符向量数组的方法 在 MATLAB 中,字符向量数组(字符向量元胞数组)是处理文本数据的传统方式。以下是定义和操作的完整指南: #### 1. **定义字符向量数组** 字符向量数组本质上是**元胞数组**,每个元胞包含一个字符向量: ```matlab % 方法1:直接创建元胞数组 charCellArray = {'MATLAB', 'Python', 'C++', 'Java'}; % 方法2:使用 cell 函数预分配 charCellArray = cell(1,4); % 创建1行4列的空元胞数组 charCellArray{1} = 'MATLAB'; charCellArray{2} = 'Python'; charCellArray{3} = 'C++'; charCellArray{4} = 'Java'; ``` #### 2. **访问字符向量** 使用**花括号 `{}`** 获取字符向量内容: ```matlab % 访问第1个字符向量 firstChar = charCellArray{1}; % 结果:'MATLAB'(字符向量) % 访问第3个字符向量 thirdChar = charCellArray{3}; % 结果:'C++'(字符向量) % 访问多个元素(返回子元胞数组) subCell = charCellArray([2,4]); % 结果:{'Python','Java'}(元胞数组) ``` #### 3. **字符数组字符串数组转换** ```matlab % 字符向量元胞数组字符串数组 strArray = string(charCellArray); % 结果:["MATLAB","Python","C++","Java"] % 字符串数组 → 字符向量元胞数组 newCellArray = cellstr(strArray); % 结果:{'MATLAB','Python','C++','Java'} ``` #### 4. **字符处理函数** ```matlab % 检查字符类型 isletter('A') % 返回1(是字母) isspace(' ') % 返回1(是空格) isstrprop('123','digit') % 检查是否为数字[^3] % 查找操作(返回出现位置的元胞数组) positions = strfind(charCellArray, 'a'); % 结果:{[], [5], [], [2]}(Python的'a'在第5位,Java的'a'在第2位)[^5] ``` #### 5. **重要区别** | 特性 | 字符向量元胞数组 | 字符串数组 | |------|------------------|------------| | **定义** | `{'文本'}` | `["文本"]` | | **索引** | `{ }` 获取内容 | `( )` 直接获取字符串 | | **存储** | 每个元素独立存储 | 连续内存存储 | | **推荐度** | 旧版兼容 | 官方推荐[^1][^2] | > **建议**:新代码应优先使用字符串数组(`string`类型),因其内存效率更高且函数兼容性好[^1][^2]。旧代码中的字符向量元胞数组可通过`string()`函数转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值