Есть ли способ уменьшить потребление памяти в моем коде c ++? - PullRequest
0 голосов

Я новичок в C ++ и пытаюсь решить учебное упражнение на платформе викторины, но на этой платформе мне нужно использовать не более 64 МБ памяти. Мой код использует более 130 МБ.

#include <sstream>
#include <string>
#include <fstream>
#include <iterator>
#include <vector>
#include <map>

using namespace std;

template<class Container>
void splitString(const std::string &basicString, Container &cont, char delim = ' ') {
   std::stringstream ss(basicString);
   std::string token;
   while (std::getline(ss, token, delim)) {
       cont.push_back(token);
   }
}

int main() {
   int target = 0;
   int count = 0;

   std::map<int, int> set;

   string line;
   ifstream fileR("input.txt");

   std::vector<string> c;

   if (fileR.is_open()) {
       while (getline(fileR, line)) {
           if (count == 0) {
               target = std::stoi(line);
               count++;
               continue;
           }

           splitString(line, c);

           for (auto &d : c) {
               int key = std::stoi(d);

               if (set.count(key)) {
                   set[key] += 1;
               } else {
                   set[key] = 1;
               }
           }

           c.clear();
       }

       fileR.clear();
       fileR.close();
   }

   ofstream fileW;
   fileW.open("output.txt");

   bool found = false;

   for (const auto &p : set) {
       int d = target - p.first;

       if (set.count(d)) {
           if (p.first != d || set[d] > 1) {
               fileW << 1;
               found = true;
               break;
           }
       }
   }

   if (!found) {
       fileW << 0;
   }
   fileW.close();
   return 0;
}

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

1 Ответ

2 голосов
/ 26 мая 2020

Ваш вектор (c) объявляется вне l oop и не очищается каждый раз, когда вы вызываете разделенную строку. Это означает, что каждый раз, когда вы передаете строку для разделения, ваш вектор будет содержать материал из предыдущего запуска. Это намеренно? Если это не так, переместите свой вектор в l oop, прежде чем вызывать разделенную строку, или очистите его в своей функции разделенной строки. Если это сделано намеренно, предоставьте дополнительную информацию о том, что должен делать ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...