使用数组(字符串)C

时间:2016-10-04 20:35:22

标签: c++ arrays string

这是算法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;
}}

当然算法没有定型,大部分代码都不在这里,但问题是这个错误,我不能创建一个没有包含在其他元素子集中的元素的数组

1 个答案:

答案 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函数。

Here is a live example

请注意我们如何在示例中输出最终结果。使用size()成员函数而不是硬编码行数和列数。