2

そのため、現在、C++ で Set というクラスを作成しています。その中には、mCardinality という整数と、mElements という整数配列があります。mCardinality のコンストラクターで整数を受け入れられるようにしたいのですが、これを使用して整数配列にサイズを割り当てます。 ? (サイズを最大整数にして、カーディナリティのみを使用して、要素を処理するループを制限することができると思いますが、より適切なソリューションが望ましいでしょう)。

std::vector を使用して配列のサイズを変更する方法があるかもしれないことをここで見ましたが、それは機能しますか? そして...そのコードはどのように見えるでしょうか? ベクトルは、C++ の配列と同じように機能しますか?

4

4 に答える 4

3

オプションは次のとおりです。

  1. std::vectorまたは
  2. プレーンな古い配列を使用する

ベクトル付き(推奨):

class YourSet {
public:
   YourSet(int size) : elements(size)
   {
   }
private:
   std::vector<int> elements;
};

アレイを使用する場合(例外安全性の問題が発生する可能性があるため、実際には推奨されません):

class YourSet {
public:
   YourSet(int size)
   {
       elements = new int[size];
   }
   ~YourSet()
   {
        delete[] elements;
   }
private:
   int* elements;
   // no implementation to prevent shallow copying
   YourSet( const YourSet&);
   void operator=(const YourSet&);
};
于 2012-07-18T07:07:21.703 に答える
1

std::vectorあなたの目的のために働きます。

#include <vector>

class Set
{
  Set(int len)
   : mElements(len)
  {
  }

  void do_smth()
  {
    size_t vector_len = mElements.size();

    int index = 0;
    int element = mElements[index];
  }


  std::vector<int> mElements;
};
于 2012-07-18T07:07:47.193 に答える
1

ベクターはポインタを保持し、必要に応じてメモリを再割り当てします。

T* new_ptr = new T[new_size];
std::copy(ptr, ptr + size, new_ptr);
delete[] ptr;
ptr = new_ptr;
size = new_size;

簡単な例です。ベクターはアロケータを使用していますが、実際にはこのようなものです。

于 2012-07-18T07:08:02.080 に答える
1

ベクトルを探してください。アイテムを追加または削除すると自動的にサイズが変更され、必要に応じてサイズを指定することもできます。

 vector<myClass> m_vClasses;
 myClass myNewObject;
 m_Classes.push_back(myNewObject); // Vector resized when you add new element

myClassデストラクタがクラスに割り当てられたメモリを正しく解放することを前提として、メモリやその他の問題について心配する必要はありません(myClassが動的に割り当てられたメモリを指すポインタでない限り) 。ベクトルは自動的にサイズ変更を処理します。

于 2012-07-18T07:09:05.857 に答える