Pensé que una forma genial de usar vectores podría ser tener una plantilla de clase de vector que contenga dos variables int separadas para las coordenadas x / y para graficar.

Ejemplo:

std::vector<int, int> *name*;
// First int. being the x-intercept on a graph
// Second int. being the y-intercept on a graph

(También entiendo que podría hacer cada ubicación par / impar o dos vectores separados para clasificar cada coordenada x / y, pero para mí solo me gustaría ver si esto podría funcionar)

Sin embargo, después de hacer este tipo de vector, encontré un problema al asignar qué int dentro del vector se escribirá o extraerá. ¿Alguien podría decirme cómo mejorar select y std::cout ambas entradas x / y de manera adecuada?

PD - Mi objetivo principal, al usar vectores de esta manera, es hacer una salida gráfica muy básica para la terminal de Visual Studio. Al mismo tiempo que puede cambiar las intersecciones x / y individuales 'seleccionando' y cambiando si es necesario. Estas coordenadas se enviarán al terminal a través de bucles for / while.

Además, ¿alguien quisiera enumerar diferentes formas de hacer las coordenadas x / y mejor con diferentes contenedores?

0
Daniel Escobedo 17 oct. 2019 a las 21:52

1 respuesta

La mejor respuesta

Tu pregunta es bastante amplia, en otras palabras, pide demasiado. Solo intentaré darte algunos consejos a partir de los cuales puedes trabajar hasta llegar a lo que te gusta.

A) equidistante x

Si sus valores de x son equidistantes, es decir, 0, 0.5, 1, 1.5 entonces no hay necesidad de almacenarlos, simplemente use un

std::vector<int> y;

Si no se conoce el número de variables en el momento de la compilación, de lo contrario,

std::array<int,N> y;

B) arbitrario x

Hay varias opciones que dependen de lo que realmente desee hacer. Para simplemente almacenar (x,y) - pares e imprimirlos en la pantalla, todos funcionan igual de bien.

mapa

std::map<int,int> map_x_to_y = { { 1,1}, {2,4}, {3,9}};
// print on screen
for (const auto& xy : map_x_to_y) {
   std::cout << xy.first << ":" xy.second;
}

un vector de pares

std::vector<std::pair<int,int>> vector_x_and_y = { { 1,1}, {2,4}, {3,9}};

La impresión en pantalla es en realidad lo mismo que con map. La ventaja del mapa es que tiene sus elementos ordenados, mientras que este no es el caso del vector.

C) no utilizar ningún contenedor

Para los cálculos de peso ligero, puede considerar no almacenar los pares (xy) en absoluto, sino simplemente usar una función:

int fun(int x) { return x*x; }

TL; DR / más centrado

Un vector almacena un tipo. No puede tener un std::vector<int,int>. Si miras la documentación de std::vector, encontrarás que el segundo parámetro de la plantilla es un asignador (algo que probablemente no tengas que preocuparte por algún tiempo). Si desea almacenar dos valores como un elemento en un vector, debe usar std::vector<std::pair<double,double>> o un contenedor diferente.

PS

Usé std::pair en los ejemplos anteriores. Sin embargo, considero que es una buena práctica nombrar las cosas siempre que puedo y dejar std::pair para los casos en los que simplemente no puedo dar nombres mejores que first y second. Con este espíritu, puede reemplazar std::pair en los ejemplos anteriores con un

struct data_point {
    int x;
    int y;
};
1
largest_prime_is_463035818 21 oct. 2019 a las 12:24