2016-10-04 65 views
0

这是算法Malgrange,我需要创建从C0阵列Y1的beta测试码...(Y1 = C0 - X0)与阵列(字符串)C工件

#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

帮你一个忙,学习如何使用STL容器类而不是原始数组和指针。 – PaulMcKenzie

+0

“'std :: string ** masiv_c0 = new std :: string * [3]'” - 不要使用动态分配的C数组。如果你想要一个'std :: string'实例的矩阵,那么使用'std :: vector >'并且保存你自己的头痛。 – ArchbishopOfBanterbury

回答

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”的2维阵列由第一与masiv_C0阵列开始了:

String2D masiv_Y1 = masiv_C0; 

一旦我们有了这一点,那么我们可以很容易地使用一个循环,并使用从除去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()成员函数而不是硬编码行数和列数。

+0

@ Merk30您需要修复CodeBlocks正在使用的编译器。CodeBlocks是一个IDE,而不是编译器。您可能正在使用一个非常旧的版本的g ++。另外,“Linux”不是C++编译器,它是一个操作系统。基本上你需要正确地知道和识别你正在使用的工具,第一个是你用来构建代码的确切编译器和版本。代码编译没有错误使用Visual Studio 2015,以及各种版本的g ++和铿锵[见这里](http://rextester.com/VQTWZ20327) – PaulMcKenzie

+0

似乎你忘了'#包括'。第二[这里是你的代码使用'std :: vector'](http://ideone.com/C2Hed6)。 – PaulMcKenzie