2016-10-04 3 views
0

Это бета-тест код алгоритма Мальгранж, мне нужно создать массив Y1 от C0 ... (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 легко, используя петлю и с помощью 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.

Here is a live example

Обратите внимание, как мы также выводим окончательные результаты в примере. Функция члена size() используется вместо жесткого кодирования количества строк и столбцов.

+0

@ Merk30 Вам необходимо исправить свой компилятор, который использует CodeBlocks.CodeBlocks - это IDE, а не компилятор. Возможно, вы используете очень старую версию g ++. Кроме того, «Linux» не является компилятором C++, это операционная система. В основном вам необходимо правильно знать и идентифицировать инструменты, которые вы используете, номер один - это точный компилятор и версия, которые вы используете для создания кода. Код компилируется без ошибок с помощью Visual Studio 2015 и различных версий g ++ и clang [как показано здесь] (http://rextester.com/VQTWZ20327) – PaulMcKenzie

+0

Кажется, вы забыли '#include '. Второй [здесь ваш код с использованием 'std :: vector'] (http://ideone.com/C2Hed6). – PaulMcKenzie

Смежные вопросы