возврат двух созданных массивов в C++

Привет у меня есть текстовый файл, содержащий два массива и одно значение (все целые числа) как это

3 90 22 5 60 33 24

Где первое число обозначает сколько целых чисел для чтения в. Я могу читать во всем этом в одной функции. Мне нужны несколько функций, чтобы смочь использовать различные матрицы и первую переменную?

    ifstream in(SOMEFILE.dat);
    if (!in) {
    cerr << "Cannot open file.\n";
    return -1;}
    in >> VAR;
    A=new int[VAR]; 
    B=new int[VAR];
    for(int i=0 ;i<VAR;i++){
      in >>A[i];
    }
 for(int i=0 ;i<VAR;i++){
      in >>B[i];
    }

       in.close();

Выше код, который я имею до сих пор, и это работало бы в основной функции. Я должен записать три функции для чтения этой информации в том, таким образом, я могу использовать ее в своей программе или являюсь там каким-либо способом, которым я мог, например, отправить в трехочковых к функции?

I would like A to be 90 22 5
B to be 60 33 24
And VAR to be 3

Спасибо

5
задан 15 February 2010 в 11:21
поделиться

4 ответа

Всякий раз, когда вы хотите сгруппировать элементы данных, используйте класс или структуру. Например, чтобы передать три целых числа в качестве координат x, y и z,:

struct Coord {
   int x, y, z;
};

и затем передать структуру в функцию:

void f( Coord & c ) {
}

То же самое относится и к массивам, но в вашем случае вы бы сделали так, чтобы структура содержала указатели.

Ваш вопрос фактически открывает огромные области программирования на C++, о которых, похоже, вы не знаете. Некоторые вещи, о которых вам следует прочитать, прежде чем двигаться дальше:

  • концепция структур, как описано выше
  • конструкторы и деструкторы для структур
  • когда и когда не использовать динамическое распределение памяти
  • использование контейнеров стандартной библиотеки C++, таких как std::vector

Это может показаться много, но как только вы будете иметь четкое представление об этом, вы найдете программирование на C++ намного, намного проще и безопаснее.

2
ответ дан 15 December 2019 в 06:24
поделиться

Самый простой способ - определить тип, скажем структуру, который представляет данные из одной строки:

struct MyMatrix
{
  int size;
  int *a;
  int *b;
};

Затем напишите функцию, которая читает одну такую экземпляр из строки текста:

struct MyMatrix load_matrix(std::ifstream& stream)
{
  MyMatrix m;

  stream >> m.size;

  m.a = new int[m.size];
  for(int i=0 ;i < m.size; i++)
      stream >> m.a[i];

  m.b = new int[m.size];
  for(int i=0 ;i < m.size; i++)
      stream >> m.b[i];

  return m;
}

В этом коде отсутствует проверка ошибок, но вы можете это добавить. Помните, что выделение памяти может дать сбой.

1
ответ дан 15 December 2019 в 06:24
поделиться

Если вы хотите вернуть несколько элементов, вы можете либо использовать дополнительные выходные параметры в своих функциях (передаваемых по ссылке), либо вернуть кортеж. Я предпочитаю более поздний вариант, так как он дает более читаемый код.

Вместо того, чтобы вручную управлять памятью ваших массивов с помощью new и delete [] , вы можете использовать std :: vector для достижения эквивалентного поведения . Каждый вектор хранит свой размер, поэтому вам не нужно возвращать для этого дополнительную переменную.

Подводя итог, в этом случае вы можете просто вернуть кортеж из двух векторов. В стандартной библиотеке двухэлементные кортежи представлены классом std :: pair . Следовательно, ваша функция вернет пару векторов: std :: pair , std :: vector > . Так как набирать много, лучше использовать typedef .

Это одна из возможных реализаций вашей функции. Обратите внимание, что вы можете избежать написанных вручную циклов благодаря стандартному классу istream_iterator :

typedef std::pair<std::vector<int>, std::vector<int> > Data;
Data read(std::ifstream & ifs)
{
    int n;
    ifs >> n;
    typedef std::istream_iterator<int> in_it;

    std::vector<int> a(n);
    std::copy(in_it(ifs), in_it(), a.begin());

    std::vector<int> b(n);
    std::copy(in_it(ifs), in_it(), b.begin());

    return Data(a, b);
}

И вот как вы будете использовать свою функцию.Обратите внимание, что вы не возвращаете размер неявно, но вы можете легко получить его с помощью std :: vector :: size () .

int main() {

  std::ifstream ifs("SOMEFILE.txt");
  Data data = read(ifs);

  unsigned int n = data.first.size();
  std::vector<int> & a = data.first;
  std::vector<int> & b = data.second;

  return 0;
}

РЕДАКТИРОВАТЬ: Предложение Нила использовать выделенную структуру лучше масштабируется и приводит к более удобочитаемому коду, так что вы обязательно должны учитывать это. В этом случае ваша структура будет такой:

struct Data {
    std::vector<int> a, b;
};

И ваша функция main будет идентична, за исключением того, что вы должны заменить first и second на a и b .

0
ответ дан 15 December 2019 в 06:24
поделиться

Или просто используйте params по ссылке.

int theFunction(int*& arrayA, int*& arrayB){
    int size;
    // ...
    arrayA = new int[size];
    arrayB = new int[size];
    // ...
    return size;
}
0
ответ дан 15 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: