query objects elemmatch clase array c++ vector adjacency-list

c++ - objects - Insertar elementos en el vector 2D



mongodb subdocument query (2)

así que estoy creando una clase que implementa una lista de adyacencia. Actualmente en mi definición de clase inicialicé dos vectores:

vector<vector<int>> adjList; vector<int> neighbors;

y declare dos funciones que planeo usar para hacerlo:

bool constructAdjList(); bool insertIntoAdjList(int, int);

Cada vez es más difícil enfocar mi cabeza en vectores 2D. Entiendo que es esencialmente un vector de vectores, pero estoy confundido acerca de cómo insertar un nuevo valor en uno de los "subvectores". Por ejemplo, puedo crear una lista de adyacencia en createAdjList que está vacía con el siguiente ciclo:

for (int i = 0; i < numOfValues; i++){ neighbors.push_back(0); adjList.push_back(neighbors); neighbors.clear(); }

Pero ¿cómo puedo decir, push_back el valor 5 al 4to vector en adjList, que estaría representado en mi función insertIntoAdjList como

insertIntoAdjList(4, 5);

Sé que puedo acceder a un valor específico en un vector 2D diciendo adjList [4] [1], pero ¿cómo puedo presionar uno sobre él?

¡Gracias!


Para presionar sobre el vector que es un elemento de otro vector, simplemente haz esto

adjList[x].push_back();


Un par de notas aquí.

Su ciclo se puede acortar significativamente solo usando los constructores de sus dos miembros:

vector<int> neighbors(1, 0); // set to length 1, value is zero vector<vector<int>> adjList(numOfValues,neighbors); // "outer" vector is numOfValues long . // each row is a *COPY* of neighbor

Si no puede hacer esto en el momento de la construcción (tal vez aún no se conoce numOfValues), aún hay una frase de bucle mejor que podemos usar:

// neighbors object can be reused neighbors.clear(0); neighbors.push_back(0); adjList.reserve(numOfValues); // reserving memory ahead of time will prevent allocations for (int i = 0; i < numOfValues; i++){ adjList.push_back(neighbors); // push_back is by *COPY* }

En su ejemplo, al usar clear y push_back para construir esencialmente el mismo vector en cada iteración de bucle, está arriesgando una asignación y desasignación en cada iteración. En la práctica, la mayoría de las implementaciones no harán esto, pero si podemos acortar y potencialmente hacer las cosas más eficientes, también podemos hacerlo.

Por último, si el número de vecinos es relativamente pequeño y similar fila a fila (por ejemplo, un código de elementos finitos con elementos tetraédricos, donde cada elemento se conecta a ~ 5 otros), entonces, como otros han sugerido, puede ser mejor con una estructura diferente que vector-de-vector. Por ejemplo, un único vector que está organizado lógicamente de modo que una nueva "fila" comience cada N elementos.