2016-10-04 63 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