2016-05-24 3 views
-1

Я играю с векторами и наткнулся на разные типы векторов с 2-мя. Кто-то, пожалуйста, укажите ключевые различия между этими векторными объявлениями.Разница между различными обозначениями двухмерного вектора?

Какие из них на самом деле 2-d вектор -

//c++ format 
//All libraries preincluded 
1) std::vector <int,int> v1; 
2) std::vector <pair<int,int>> v2; 
3) std::vector <int> v(10); 
4) struct node{ 
     int a,b; 
    } 
    std::vector<node> v4; 
5) std::vector< vector<int> > v5; 
+0

Они все технически "2D". Все зависит от ваших потребностей. –

+0

Первый, насколько мне известно, не является даже юридическим синтаксисом. – ArchbishopOfBanterbury

+2

Похоже, вы не играете, когда используете 'int' в качестве распределителя. – LogicStuff

ответ

0

std::vector<int,int> v1

Это незаконно синтаксис, std::vector содержит только один тип данных - второй аргумент шаблона может быть использован для настраиваемого объекта распределителя.

std::vector<std::pair<int,int>> v2

Объявляет std::vector который содержит объекты типа std::pair<int,int> таким образом, что каждый элемент вектора содержит два целых числа в паре конструкции.

std::vector<int> v(10)

конструирует std::vector из int типы с 10 по умолчанию вставленных экземпляров int.

std::vector<node> v4

Объявляет std::vector удерживающие объекты типа node где node определен в вашем вопросе. Каждый узел имеет два общедоступных поля int, поэтому действует аналогично std::vector<std::pair<int,int>>.

std::vector< std::vector<int> > v5

Это объявляет std::vector из std::vector<int> объектов таким образом, что v5 является «2d вектор» (я использую этот термин в широком смысле, технически это не совсем 2г) - то есть каждый элемент v5 содержит std::vector<int> объект.

0

Ответ не ни один из выше.

Нет такой вещи, как 2D vector. Все vectors являются 1D, но могут содержать объекты, которые придают внешний вид дополнительным размерам.

Рассмотрите вариант 5. Это vector, который содержит другие vector s и, конечно же, может выглядеть 2D при использовании. Наружный vector поставляет один размер, а содержащий vector s - другой. Но это не 2D vector. Это vector от vectors.

std::vector <int,int> v1; 

Неверный синтаксис. Это указывает, что распределитель имеет тип int и, вероятно, приводит к нескольким страницам сообщений об ошибке bizarro.

std::vector <pair<int,int>> v2; 

обеспечит матрицу N × 2, но доступ к парам является громоздким v2[n].first? Тьфу.

std::vector <int> v(10); 

Это 1D вектор, но его можно рассматривать как матрицу 5x2, если вы готовы сделать математику самостоятельно: v[row*2+column]

struct node{ 
    int a,b; 
} 
std::vector<node> v4; 

Почти идентичный вариант 2. v4[n].a не плохо , но может быть лучше.

std::vector< vector<int> > v5; 

Обложка выше. Это имеет преимущество, но допускает непрямоугольную форму и имеет ужасную производительность кеша, потому что каждый из множества vector s - это собственный зверь с собственной памятью, и эта память может быть разбросана по всему хранилищу. Читайте о пространственной местности, чтобы понять, почему это плохо.

I шаг Вариант 6

std::vector<int[2]> v6; 

Это все смежное хранение и выглядит как N х 2 матрицы: v6[row][column].

-1
  1. незаконный?

  2. Н по 2 векторов

  3. 1D вектор (резерв пространства для 10 элементов)
  4. Н по 2 векторов
  5. вектор векторов. Может быть N на M или даже в неправильной форме.

2) 4) 5) доступ к ячейкам по-разному. Предположим, что вы хотите получить доступ к ячейке в строке х, колонка у:

  • 2) у == 0: v2 [х] .first; y == 1 v2 [x] .second

  • 4) y == 0: v4 [x] .a; у == 1 v4 [х] .b

  • 5) v5 [х] [у]

+0

5 не является N по N векторам. Это вектор векторов, каждый из которых может иметь разный размер. – user463035818

+0

@ tobi303, я использую этот термин свободно, но вы правы. –

Смежные вопросы