C++中的可变长数组string

看一个题目:
编写一个程序,判断一个字符串是否为“回文”(顺读和倒读都一样的字符串称为“回文”)。

#include<iostream>
#include<string>
using namespace std;
int main()
{
  string s,g;
  cin <<s;
  for( int i=0;i<s.size();i++ )
  {
    g[s.size()-i-1]=s[i];
  }

  if( s == g )
  {
    printf("回文");
  }
  else
  {
    printf("非回文");
  }

  return 0;
}

然而这个代码并不能满足要求,我们看到第10行的代码,这行代码想按位倒序把字符串s复制给字符串g,然而这个代码并不能正常执行。有人可能会奇怪:C++中的string类定义的不是可变长字符串吗?

C++中使用string定义的字符串虽然是可变长字符串,但是不能采用上边这种方式改变长度。上边代码中的字符串g没有初始化,g[0]、g[1]这些空间都还没有被声明定义出来,所以不能直接访问和使用。所以修改一下:在输入字符串s之后把s字符串直接复制给g,这样g的长度就被改变了,也就实现了可变长数组的功能。

修改后的代码如下:

#include<iostream>
#include<string>
using namespace std;
int main()
{
  string s,g;
  cin <<s;
  g = s;
  for( int i=0;i<s.size();i++ )
  {
    g[s.size()-i-1]=s[i];
  }

  if( s == g )
  {
    printf("回文");
  }
  else
  {
    printf("非回文");
  }

  return 0;
}
### C++ 中 `string` 类型数组的声明与操作 在 C++ 中,可以通过多种方式来处理字符串数组。对于一维和二维的字符串数组,语法相对直观。 #### 声明并初始化一维 `string` 数组 可以直接通过大括号 `{}` 来初始化一个包含多个字符串的一维数组: ```cpp #include <iostream> #include <string> int main() { std::string strArray[] = {"Hello", "World"}; for (const auto& str : strArray) { std::cout << str << "\n"; } } ``` 这段代码展示了如何创建一个名为 `strArray` 的一维字符串数组,并打印其中的内容[^1]。 #### 创建和访问二维 `string` 数组 当涉及到二维数组时,在 C++ 中实际上是一系列的一维数组组成的结构。下面的例子说明了怎样定义以及遍历这样的二维字符序列集合: ```cpp #include <iostream> using namespace std; int main(){ string arr[2][2]={ {"agergre","hjtsstr"}, {"hrr","hhjsssaq"} }; // 输出整个二维数组中的每一个元素 for(int i=0;i<2;++i){ for(int j=0;j<2;++j){ cout<<arr[i][j]<<endl; } } system("pause"); return 0; } ``` 这里展示了一个简单的例子,其中包含了四个不同的字符串被存储在一个 2×2 的矩阵形式里。注意这里的索引是从零开始计数的;因此第一个位置是 `[0][0]` 而不是 `[1][1]`。 值得注意的是,虽然看起来像是真正的多维数组,但在底层实现上它们实际上是嵌套的一维数组[^2]。 #### 动态分配内存给 `string` 数组 如果事先不知道所需的空间大小,则可以考虑动态地为这些对象分配空间: ```cpp // 动态分配单个维度的情况 std::vector<std::string> vec(5); // 或者更复杂的情况下, 使用指针指向 vector<string>, 实现可变长度的二维表 std::vector<std::vector<std::string>> matrix(rows); for(auto& row : matrix){ row.resize(cols); } matrix[rowIndex][colIndex]="Some Value"; ``` 上述方法提供了更大的灵活性,尤其是在运行期间需要改变尺寸的情形下非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值