В чем разница между v [0], v.begin () и v.data () вектора v? - PullRequest
0 голосов
/ 19 октября 2019

Мне нужно отобразить мой вектор, который был отсортирован с использованием алгоритма сортировки слиянием. Однако мой друг использовал v.data (), чтобы передать вектор, в то время как я использовал v.begin (). Его код работает отлично, а мой - нет. Пожалуйста, объясните.

Я уже пытался передать v [0] и v.begin (). Не работает

void merge_sort(int *a, int i, int j);

void merge_sort(int *a, int i, int j) 
{
    int mid;

    if (i < j) {
        mid = (i + j) / 2;

        merge_sort(a, i, mid);       // left recursion

        merge_sort(a, mid + 1, j);   // right recursion

        merge(a, i, mid, mid + 1, j); 
    }
}

int main() 
{

    int num;
    cout << "Enter array length (n) = ";
    cin >> num;

    vector<int> a(num);

    cout << "Enter the number:" << endl;
    for (int i = 0; i < num; i++)
        cin >> a[i];

    merge_sort(a.data(), 0, num - 1);

    cout << "\nSorted array :\n";
    for (int i = 0; i < num; i++)
        cout << a[i] << " ";

    cout << endl;
    return 0;
}

v.begin () и v [0] показывает ошибки, в то время как v.data () работает отлично.

Ответы [ 2 ]

6 голосов
/ 19 октября 2019

Предположим, вектор v типа std::vector<int>. Тогда:

  • v[0] возвращает ссылку на первый элемент вектора, и v не должно быть пустым (в противном случае поведение не определено). Тип этого выражения: int& или const int&.

  • v.data() возвращает указатель на первый элемент вектора или некоторое неопределенное значение указателя, еслиv пусто. Тип этого выражения: int* или const int*.

  • v.begin() возвращает итератор в первый элемент вектора или v.end(), если v пусто. Тип этого выражения: std::vector<int>::iterator или std::vector<int>::const_iterator.

Поскольку ваш merge_sort ожидает в качестве первого аргумента указатель (int* a), то изиз этих трех выражений только v.data() имеет подходящий тип. Или, конечно, вы также можете передать &v[0], а также &*v.begin().

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

v.data(): возвращает прямой указатель на массив памяти, используемый вектором для хранения собственных элементов

v[0]: первый элемент vetcor

v.begin():вернуть итератор в первый элемент вектора

Ваша функция void merge_sort(int *a, int i, int j); взять указатель .. так что v.data() работает нормально ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...