Граф с std :: vectors? - PullRequest
       10

Граф с std :: vectors?

0 голосов
/ 17 октября 2019

Я подумал, что классным способом использования векторов может быть использование одного шаблона векторного класса, содержащего две отдельные переменные типа int для координат x / y в графе.

пример:

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

(я также понимаю, что я мог бы просто сделать каждое четное / нечетное местоположение или два отдельных вектора для классификации каждой координаты x / y, но для меня я просто хотел бы посмотреть, может ли это работать)

Однако, после создания этого типа вектора, я столкнулся с проблемой с назначением, какой int внутри вектора будет записан или извлечен из. Может кто-нибудь сказать мне, как наилучшим образом select и std::cout оба х / у целочисленные значения?

PS - Моя главная цель при использовании векторов таким образом - сделать очень простой вывод графика в Visual Studio. Терминал. При возможности изменения отдельных x / y-перехватов путем «выбора» и изменения при необходимости. Эти координаты будут выводиться на терминал через циклы for / while.

Кроме того, кто-нибудь хотел бы перечислить различные способы наилучшего создания координат x / y с различными контейнерами?

1 Ответ

1 голос
/ 17 октября 2019

Ваш вопрос довольно широкий, другими словами, он требует слишком много. Я просто попытаюсь дать вам несколько советов, из которых вы сможете найти путь к тому, что вам нравится.

A) равноудаленный x

Если ваши значения x равноудалены, то есть 0, 0.5, 1, 1.5, тогда нет необходимости хранить их, просто используйте

std::vector<int> y;

, если число переменных неизвестно во время компиляции, в противном случае

std::array<int,N> y;

B) произвольно x

Существует несколько опций, которыезависит от того, что вы действительно хотите сделать. Для простого хранения (x,y) -пар и печати их на экране все они работают одинаково хорошо.

map

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

вектор пар

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

Печать на экране фактически такая же, как и с map. Преимущество карты в том, что у нее упорядочены элементы, хотя это не относится к вектору.

C) не использует контейнер

Для облегченных вычисленийВы можете не хранить пары (xy), а просто использовать функцию:

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

TL; DR / более сфокусированный

Вектор хранитодин тип. Вы не можете иметь std::vector<int,int>. Если вы посмотрите документацию std::vector, то обнаружите, что вторым параметром шаблона является распределитель (что-то, о чем вам, вероятно, не придется беспокоиться в течение некоторого времени). Если вы хотите сохранить два значения как один элемент в векторе, вы должны использовать std::vector<std::pair<double,double>> или другой контейнер.

PS

Я использовал std::pairв приведенных выше примерах. Тем не менее, я считаю хорошей практикой называть вещи, когда только могу, и оставлять std::pair для случаев, когда я просто не могу дать имена лучше, чем first и second. В этом духе вы можете заменить std::pair в приведенных выше примерах на

struct data_point {
    int x;
    int y;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...