VIDTAKER.COM

Q&A

STLの文字列の比較ファンクタ


こんにちはすべて!私は次の関数子があります:

class ComparatorClass {
  public:
    bool operator () (SimulatedDiskFile * file_1, SimulatedDiskFile * file_2) {
      string file_1_name = file_1->getFileName();
      string file_2_name = file_2->getFileName();

      cout << file_1_name << " and " << file_2_name << ": ";

      if (file_1_name < file_2_name) {
        cout << "true" << endl;
        return true;
      }
      else {
        cout << "false" << endl;
        return false;
      }
    }
};

これは、することになっている厳しい弱い順序は、それがこの(1行のみ可能)デバッグの目的に長いです。

私は、STLのコンパレータ関として、この関を使用しています::セットを表します。問題されて、それだけで挿入最初の要素を返します。関数コンパレータ出力をすることにより追加コンソール、私は時間が学んだことすべて、 それ自体のファイル名を実際にある比較。

他の関連する行があります:

typedef set<SimulatedDiskFile *, ComparatorClass> FileSet;

// (FileSet files_;) <- SimulatedDisk private class member
void SimulatedDisk::addFile(SimulatedDiskFile * file) {
  files_.insert(file);
  positions_calculated_ = false;
}

編集には:を呼び出すコード。addFile()のです:

current_request = all_requests.begin();
while (current_request != all_requests.end()) {
  SimulatedDiskFile temp_file(current_request->getFileName(), current_request->getResponseSize());
  disk.addFile(&temp_file);
  current_request++;
}

all_requestsのリストは、どこで、要求はそのようなことをされたクラス:

class Request {
  private:
    string file_name_;
    int response_code_;
    int response_size_;

  public:
    void setFileName(string file_name);
    string getFileName();
    void setResponseCode(int response_code);
    int getResponseCode();
    void setResponseSize(int response_size);
    int getResponseSize();
};

私は、何が起こっているように私のhypotesisを提供できるが、私は実際にはないアイデアを持ってください。任意のポインタを事前に感謝します。



4 Replies

1)

そこには、機能的に言えば投稿したコードでは何も間違っている。ここでは完全なテストプログラムとは - 私だけの空欄に、まったくあなたのコードを変更しないいただいている。

#include <iostream>
#include <string>
#include <set>

using namespace std;

class SimulatedDiskFile
{
public:
 string getFileName() { return name; }

 SimulatedDiskFile(const string &n)
  : name(n) { }

 string name;
};

class ComparatorClass {
  public:
 bool operator () (SimulatedDiskFile * file_1, SimulatedDiskFile * file_2) {
   string file_1_name = file_1->getFileName();
   string file_2_name = file_2->getFileName();

   cout << file_1_name << " and " << file_2_name << ": ";

   if (file_1_name < file_2_name) {
  cout << "true" << endl;
  return true;
   }
   else {
  cout << "false" << endl;
  return false;
   }
 }
};

typedef set<SimulatedDiskFile *, ComparatorClass> FileSet;

int main()
{
 FileSet files;

 files.insert(new SimulatedDiskFile("a"));
 files.insert(new SimulatedDiskFile("z"));
 files.insert(new SimulatedDiskFile("m"));

 FileSet::iterator f;
 for (f = files.begin(); f != files.end(); f++)
  cout << (*f)->name << std::endl;

 return 0;
}

私はこの出力を得る:

z and a: false
a and z: true
z and a: false
m and a: false
m and z: true
z and m: false
a and m: true
m and a: false
a
m
z

そのセットは、すべての3つのことに格納され、あなたの比較では、ログ終了まで注意してください賢明な振る舞いを示しています。

編集:

あなたのバグは、これらの行です:

SimulatedDiskFile temp_file(current_request->getFileName(), current_request->getResponseSize());

disk.addFile(&temp_file);

あなたは、ローカルオブジェクトのアドレスを取っている。ループは、オブジェクトが破棄され、次のオブジェクトが同じ空間に割り当てられている回避するたびに。従って、唯一の最終的なオブジェクトはまだループの最後に存在し、あなたが同じオブジェクトに複数のポインタを追加しました。ループ外では、全てのベットがオフのため、現在のオブジェクトのいずれも存在している。

いずれかの新しい(ように私のテストでは、各SimulatedDiskFileを割り当てるが、その後は、ときにそれらを削除する)を把握する、または他のポインタを使用していないよ、すべての(はるかに簡単それはあなたの問題の制約を適合する場合)。


2)

そしてここで問題があります:

SimulatedDiskFile temp_file(current_request->getFileName(),
                                   current_request->getResponseSize());
disk.addFile(&temp_file);

あなたはすぐに破棄される変数へのポインタを追加している。あなたが動的に自衛隊のオブジェクトを作成する必要があります。


3)

urrent_request = all_requests.begin();
while (current_request != all_requests.end()) {
  SimulatedDiskFile temp_file(...blah..blah..); ====> pointer to local variable is inserted
  disk.addFile(&temp_file);
  current_request++;

temp_fileがスコープ外に瞬間次の繰り返しのwhileループに行くと思います。を挿入するコードを変更する必要があります。ヒープ上に作成SimulatedDiskFileオブジェクトとそれ以外のオブジェクトがある場合、小さいし、ストアセット内の値で押してください。


4)

同意を@エリカー。すべてのよさそうだ。あなたはall_requests内部を見ていたか?正常に動作しているかもしれないすべてのファイル名が同じと他のすべてのですか? (ちょうど大声でここに考えて)