这是算法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;
}}
当然算法没有定型,大部分代码都不在这里,但问题是这个错误,我不能创建一个没有包含在其他元素子集中的元素的数组
答案 0 :(得分:0)
如果您发布了正确的输出应该是什么,那将会有所帮助。
但是,根据您的描述,如果您使用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;
完成后,我们可以轻松地使用循环并使用erase / remove惯用法从masiv_Y1
中删除元素:
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()
成员函数而不是硬编码行数和列数。