c++ - 以 vector 作为类成员的对象数组

标签 c++

我有一个对象数组,其中有一个 vector 作为类成员(实际上它是一个结构)。结构是:

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];

我想将一些整数添加到对象内部的 vector 中。

我试过这个(在一个函数内):

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

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

它们编译得很好,但没有向 vector 中添加任何内容。正确的方法是如何做到这一点?这是从数据库读取并添加整数的函数。从 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();
        }
    }
}

最佳答案

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

上面的函数需要一个 int**按值(value)。该拷贝称为 cellBorderNodes在函数里面。在下一行中,您更改了 copy 的值并继续更新它。这些更改都不会在函数之外可见。 (而且你会泄漏获得的内存)

如果你想传递一个 int**并在函数内部修改它,考虑通过引用传递它,如 int**& .但是您最好使用更高级别的构造(传递 vector<vector<int>>& ,创建表示数据的类型并按值传递它...)

关于c++ - 以 vector 作为类成员的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14656406/

相关文章:

c++ - 限制继承

c++ - 在我的函数中使用简单类时出现 undefined reference 错误

c++ - STL ref 和 cref 函数

c++ - 从 std::call_once 抛出异常

c++ - OpenCV SIFT 描述符关键点半径

c++ - 在派生类中重写了哪个基类虚析构函数

c++ - 如何更改 for 循环以便我可以使用 eof?

c++ - Visual Studio 2013 中的 "per file"自定义生成步骤在哪里?

c++ - G++ 编译器错误 - 此处首先需要合成方法

c++ - 在本地类中定义结构并初始化它