使用数组(字符串)C
Work with arrays (string) C
这是算法Malgrange的beta测试代码,我需要从C0创建数组Y1…(Y1 = C0 - X0)
#include <iostream>
using namespace std;
int main()
{
// create array C0
string** masiv_C0=new string*[3];
for (int i=0;i<3;i++)
masiv_C0[i]=new string [2];
masiv_C0[0][0]="AB";
masiv_C0[0][1]="C";
masiv_C0[1][0]="X";
masiv_C0[1][1]="Z";
masiv_C0[2][0]="XY";
masiv_C0[2][1]="ZQ";
//create array X0
string** masiv_X0=new string*[1];
masiv_X0[i]=new string [2];
masiv_X0[0][0]="X";
masiv_X0[0][1]="Z";
//create array Y1 = C0 - X0 (remove from C0 elements X0)
bool flag;
string** masiv_Y1=new string*[3];
for (int i=0;i<3;i++)
masiv_Y1[i]=new string [2];
for (int i=0;i<3;i++)
{
flag=true;
for (int j=0;j<3;j++)
{
if ((masiv_C0[i][0]==masiv_X0[j][0])&&(masiv_C0[i][1]==masiv_X0[j][1]))
{
flag=false;
break;
}
}
if (flag)
{
masiv_Y1[i][0]=masiv_C0[i][0];
masiv_Y1[i][1]=masiv_C0[i][0];
}
}
for (int i=0;i<3;i++)
{
for (int j=0;j<2;j++)
{
cout<<masiv_Y1[i][j];
}
cout<<endl<<endl;
}}
当然,算法还没有最终确定,大部分代码不在这里,但问题是这个错误,我不能创建一个数组没有包含在其他元素的子集中的元素
如果你发布了正确的输出应该是什么,这将是有帮助的。
然而,根据你的描述,如果你使用STL容器和算法来做任何类型的元素删除,因为数组不能调整大小,它将更好地服务。例如,std::vector
类充当元素的动态数组。
你的代码试图通过重写先前的元素来"调整"数组的大小,这在使用std::vector
时是不必要的,因为使用vector
,你实际上是在删除元素,而不仅仅是重写数组中的项。
这是一个使用std::vector
的代码实现,以及一些STL算法来完成这项工作(再次,我将按照你在你的帖子中的描述):
首先使用必要的头文件:
#include <vector>
#include <string>
#include <algorithm>
接下来,为了方便,我们创建一些typedefs
。
typedef std::vector<std::string> String1D; // a 1 dimensional "array" of string
typedef std::vector<String1D> String2D; // a 2 dimensional "array" of string
现在我们有了上面的内容,创建二维数组就很简单了,不需要使用new[]
:
int main()
{
// create array C0
String2D masiv_C0(3, String1D(2));
masiv_C0[0][0]="AB";
masiv_C0[0][1]="C";
masiv_C0[1][0]="X";
masiv_C0[1][1]="Z";
masiv_C0[2][0]="XY";
masiv_C0[2][1]="ZQ";
//create array X0
String2D masiv_X0(1, String1D(2));
masiv_X0[0][0]="X";
masiv_X0[0][1]="Z";
接下来,我们简单地创建一个"Y"二维数组,首先从masiv_C0数组开始:
String2D masiv_Y1 = masiv_C0;
一旦我们有了这个,然后我们可以很容易地从masiv_Y1
中删除元素,使用循环和使用erase/remove习语:
for ( size_t i = 0; i < masiv_X0.size(); ++i)
{
for ( size_t j = 0; j < masiv_X0[i].size(); ++j)
{
auto& str = masiv_X0[i][j];
for (size_t cur = 0; cur < masiv_Y1.size(); ++cur)
{
auto iter = std::remove(masiv_Y1[cur].begin(), masiv_Y1[cur].end(), str);
masiv_Y1[cur].erase(iter, masiv_Y1[cur].end());
}
}
}
所以基本上,对于masiv_X0
数组中的每个字符串,我们遍历masiv_Y
数组的每一行,搜索并删除masiv_X0
字符串。这是通过使用std::remove
函数来完成的,然后使用vector::erase
函数来清除数组中的元素。
下面是一个实例
注意我们在示例中也是如何输出最终结果的。使用size()
成员函数代替硬编码行数和列数。
相关文章:
- 将C#字符串数组传递给C++
- 如何为 C 型字符串数组编写 getter 和 setter?
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 尝试将 c 字符串数组与分隔符连接起来
- 将字符串数组传递给接受常量字符**的函数
- 返回 C++ 中的字符串数组
- 如何从COM模块中的函数返回字符串数组?
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 删除字符串数组
- 如何将字符串数组返回到 java JNI
- 将字符串数组作为函数参数传递
- C++将字符串数组的元素存储到变量中
- 循环访问还包含未使用元素的字符串数组
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 乘以字符串/数组和全局数组
- 递归二进制搜索与字符串数组
- 如何初始化一个标准::字符串数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++字符串数组的动态向量
- 给定一个等长字符串数组