1

クラスメンバーとしてベクトルを持つオブジェクトの配列があります(実際には構造体です)。構造体は次のとおりです。

struct Cell {
  vector<int> borderNodes;
  vector<int> helperNodes;

  int minNodePointer;
  int maxNodePointer;


  Cell() {
    minNodePointer = -1;
    maxNodePointer = -1;
  }

  Cell(int _minNodePointer, int _maxNodePointer) {
    minNodePointer = _minNodePointer;
    maxNodePointer = _maxNodePointer;
  }

  vector<int>& getHelperNodes() {
    return helperNodes;
  }

  vector<int>& getBorderNodes()  {
    return borderNodes;
  }

  void setHelperNodesArray() {
    sort(helperNodes.begin(), helperNodes.end());
  }

  void setBorderNodesArray() {
    sort(borderNodes.begin(), borderNodes.end());
  }
}; 

これらのオブジェクトの配列をグローバル変数として次のように作成しました。

Cell* cells = new Cell[maxNumberOfCells];

オブジェクト内のベクトルに整数を追加したいと思います。

私はこれを試しました(関数内):

cells[cellId].borderNodes.push_back(node_id);

また

cells[cellId].getBorderNodes().push_back(node_id);

コンパイルは正常ですが、ベクトルには何も追加されません。これを行う正しい方法は何ですか?これは、dbから読み取り、整数を加算する関数です。クエリとdbからの読み取りは正しいので、間違いはありません。

void loadBorderNodesPerCellBnOnly(bool shouldRearrangeNodes, int subtractor, int maxNumberOfCells, int** cellBorderNodes) {
    cellBorderNodes = new int*[maxNumberOfCells];
    try {
        work W(Conn);
        for (int rownum = 0; rownum < r.size(); ++rownum) {
            const result::tuple row = r[rownum];

            vector<string> s = split(row[1].as<string > (), ' ');
            const int mySize = s.size();
            int cellId = row[0].as<int> ();
            cellBorderNodes[cellId] = new int[mySize];
            for (int k = 0; k < mySize; k++) {
                int node_id = atoi(s[k].c_str());
                cellBorderNodes[cellId][k] = node_id;
                (cells[cellId].getBorderNodes()).push_back(node_id);
                try {
                    nodes[node_id - subtractor].cellId = cellId;
                } catch (const std::exception &e) {
                    std::cerr << e.what() << std::endl;
                }
                nodes[node_id - subtractor].isBorderNode = true;
            }
            s.clear();
        }
    } catch (const std::exception &e) {
        std::cerr << e.what() << std::endl;
    }


    for (int k = 0; k < maxNumberOfCells; k++) {
        cout << k << ": " << cells[k].borderNodes.size() << endl;
        cells[k].setBorderNodesArray();
        if (maxBorderNodesPerCell < cells[k].borderNodes.size()) {
            maxBorderNodesPerCell = cells[k].borderNodes.size();
        }
    }
}
4

1 に答える 1

2
void loadBorderNodesPerCellBnOnly([...], int** cellBorderNodes) {
    cellBorderNodes = new int*[maxNumberOfCells];

上記の関数はint**by値を取ります。コピーはcellBorderNodes関数内で呼び出されます。次の行で、コピーの値を変更し、それを更新し続けます。これらの変更はいずれも、関数の外部には表示されません。(そして、取得したメモリをリークします)

を渡しint**て関数内で変更する場合は、のように参照によって渡すことを検討してくださいint**&。ただし、より高いレベルの構成を使用する方がよい場合があります(を渡しvector<vector<int>>&、データを表す型を作成し、値で渡します...)

于 2013-02-01T23:09:10.363 に答える