0

これで機能はOK、話題は達成。みんな、ありがとう。

クラス内に次の非常に単純な構造があります。

struct Data
{
    string name1;
    string name2;
    string name3;
    string name4;
}

私は初期化します:

Data **data;
data=new Data*[size];

問題は、配列の要素へのすべてのポインターを位置 N から右にシフトして、新しい要素を N に挿入できるようにすることです。さまざまなことを試しましたが、すべてが要素の配列を指すようになりました同じオブジェクト...

要素を削除してすべてを左にシフトする同様の機能があります。それはうまくいっています:

int Del_element(/*some parameters*/)
{
    found=Bin_search(Name1,Name2); //binary search. Returns index of element.
    if (found<0) return 0; //element wasn't found

    delete data[found]; //delete pointer
    for (int i=found; i<index-1; i++) //shift all pointers to the left
    {
        data[i]=data[i+1];
    }
    index--;
    return 1;
}

私が実装した機能は以下のとおりです。

void re_size() 
{
int size_old=size;
size*=2;
Data **tmp_array;

tmp_array = new Data*[size];

copy(data, data+size_old, tmp_array);
delete []data;
data=new Data*[size];
data=tmp_array;
}



 int Add( const string & Name1,const string & Name2,const string & Name3, const string & Name4 )
    {
        int found=Bin_search(Name1,Name2); //binary search. Return positive number if found, or negative as the position to insert new element;

  if (found>0)  //if element already exists
  {
      return 0;
  }


if ((index+1)==size) {re_size();}

data[index]= new Record(Name1,Name2,Name3,Name4);
if (index>0)
{
  for (int i=index; i>-found; i--)
  {
   *data[i]=*data[i-1];
  } 

  data[-found]->name1=Name1;
  data[-found]->name2=Name1;
  data[-found]->name3=Name1;
  data[-found]->name4=Name1;
}

 index++; 
 return 1;
}

基本的に、配列の末尾で新しい要素を初期化し、配列の末尾から見つかった位置に要素をコピーし、値を data[-found] にコピーします。

4

2 に答える 2

0

動作しないコードを表示していないので、何が間違っていたかを推測する必要があります。

要素 0 を 1 に、1 を 2 に、2 を 3 に、などとシフトしたに違いありません。しかし、1 を 2 にシフトすると、元の 0 に含まれていたものが含まれます。もともと 0 だった 1 からシフトしただけです。

最後からシフトを行う必要があります: N-1 から N、N-2 から N-1、N-3 から N-2 など。

シフトしているものがポインターであるという事実はまったく無関係です。数値の配列でも同じ問題が発生します。

于 2013-03-30T01:15:39.163 に答える
0

まず、Del_element新しい着信ポインタの要素を削除する関数がここにあります。それが本当なら、解放された要素 ( data[first]) を新しい要素 ( ) で占有するだけなので、機能しませんdata[first+1]

Nしかし、等しいかどうか、sizeそして新しい着信ポインタがサイズ内にある必要があるかどうかを確認する必要がある場合は、問題ありません。

ただし、実際のより完全なコードを表示する必要があります。

よし、そのほうがいい。まず、戻り型falseのある関数でint返すのはあまり良くないと思います。第二に、ここに大きな問題があると感じていますfor (int i=index-1; i>-found; i--)。なぜi>-foundですか?

于 2013-03-30T01:36:49.457 に答える