Nadmiarowe dane w klasie

0

Witam.

Mam mniej więcej taki kod:

#include <iostream>
#include <vector>

class TestClass
{
public:
  TestClass(std::string file_, int x_) : file(file_), x(x_) {}
private:
  std::string file;
  int x;

};


int main(int argc, char* argv[])
{
  using namespace std;
  const int end = 100000;

  const char *files[] = { "file1", "file2", "file3",
                         "file4", "file5", "file6",
                         "file7", "file8", "file9",
                         "file10",
                        };


  vector<TestClass*> container;
  string tmpFile =  files[0];
  int c = 0;
  for (int i = 0; i < end ; ++i)
    {
      if (i % 10000 == 0)
        {
          tmpFile =  files[c];
          c++;
        }

      container.push_back(new TestClass(tmpFile, i));
    }
  return 0;
}

Problem w tym, że file z klasy TestClass jest nadmiarowe. Będę miał 10 tyś obiektów klasy TestClass, które będą miały tą samą wartość pola file.
Jak to najlepiej rozwiązać ?

0

Usunac to pole z klasy i zrobic cos takiego:

map<string, vector<TestClass*>> container;

Dodajesz obiekty mniej-wiecej tak:

container["file1"].push_back(new TestClass(...));
0

Jest to rozwiązanie mojego problemu, z tym że w tym przypadku będę miał problem z sortowaniem danych ?

0

Fajnie by bylo gdybys napisal jak chcesz je sortowac...

Mozesz tez zrobic po prostu tak:

vector<pair<string, vector<Class*>>> container;

Jesli Ci to w czyms pomoze.

W obu przypadkach zeby dojsc do pierwotnej formy, trzeba wprowadzic dodatkowy poziom abstrakcji, czyt. klase opakowujaca takie cudo i dajaca znosny interfejs.

dodanie znacznika <code class="cpp"> - fp

0
Taumas napisał(a):

Problem w tym, że file z klasy TestClass jest nadmiarowe. Będę miał 10 tyś obiektów klasy TestClass, które będą miały tą samą wartość pola file.

Rozwiązaniem może być zmienna statyczna.
Przykład:

#include <iostream>

using namespace std;

class klasa
 {
  public:
   klasa(int a) : x(a) {}
   void zmien(string b) {ciag = b;}
   void wypisz(void) {cout<<x<<' '<<ciag<<'\n';}
  private:
   static string ciag;
   int x;
 };

string klasa::ciag = "tekst jakis";

int main()
{
 klasa c(7),d(8);
 c.wypisz();
 d.wypisz();
 c.zmien("abcde");
 c.wypisz();
 d.wypisz();
  return 0;
}

Jeśli natomiast mają być różne wartości tego ciągu w jednym momencie (jak zauważył __temp), ale identyczne w podgrupach, można posłużyć się referencją.

#include <iostream>

using namespace std;

class klasa
 {
  public:
   klasa(int a, string& b) : x(a), ciag(b) {}
   void zmien(string b) {ciag = b;}
   void wypisz(void) {cout<<x<<' '<<ciag<<'\n';}
  private:
   string& ciag;
   int x;
 };

int main()
{
 string tablica[]={"jeden","dwa"};
 klasa c(7,tablica[0]),d(8,tablica[0]),e(9,tablica[1]);
 c.wypisz();
 d.wypisz();
 e.wypisz();
 c.zmien("Kasia");
 c.wypisz();
 d.wypisz();
 e.wypisz();
  return 0;
}
0

Będę miał 10 tyś obiektów klasy TestClass, które będą miały tą samą wartość pola file.

std::string przez C++11 korzysta z copy-on-write, zatem te wszystkie 10 000 obiektów będzie korzystało z tego samego bufora, więc nie powinno być żadnej wielkiej straty pamięci.
Jeżeli korzystasz/zamierzasz korzystać/wtf z kompilatora zgodnego z najnowszym standardem i chcesz oszczędzić ten cały 1 MB pamięci (10000 obiektów po 100 bajtów każdy, pesymistycznie), wyjściem może być chociażby przekazywanie wskaźnika/referencji - jak w poście @Tacet powyżej.

0

Nadmiarowość mogę rozwiązać mniej więcej w taki sposób:

#include <iostream>
#include <vector>

class TestClass
{
public:
  typedef std::vector<int> IntList;
  TestClass(std::string file_) : file(file_), intList(new IntList) {}
  ~TestClass() { delete intList; }

  void addItem(const int item) {intList->push_back(item); }
private:
  std::string file;
  IntList* intList;
};

typedef std::vector<TestClass*> SingleFileContainer;

int main(int argc, char* argv[])
{
  using namespace std;
  const int end = 100000;

  const char *files[] = { "file1", "file2", "file3",
                          "file4", "file5", "file6",
                          "file7", "file8", "file9",
                          "file10",
                        };


  SingleFileContainer container;
  container.push_back(new TestClass(files[0]));

  int c = 0;
  for (int i = 0; i < end ; ++i)
  {
    container.at(0)->addItem(i);
    if (i % 10000 == 0)
    {
      c++;
      container.push_back(new TestClass(files[c]));
     }
    }
  return 0;
}

Ale co w przypadku gdy będę chciał posortować wszystkie elementy <0, 100000) ??

1 użytkowników online, w tym zalogowanych: 0, gości: 1