Использование std :: move для вставки среднего элемента вектора в начале не работает - PullRequest
2 голосов
/ 08 июня 2019

У меня есть вектор с несколькими элементами. Я попытался вставить один из своих элементов, в начале, используя вставки и перемещения -

v.insert(v.begin(), std::move(v[4]));

Это вставило неправильный элемент в начало. Полный код -

#include <iostream>
#include <vector>

using namespace std;

struct Node
{
    int* val;
};

// Util method which prints vector
void printVector(vector<Node>& v)
{
    vector<Node>::iterator it;

    for(it = v.begin(); it != v.end(); ++it)
    {
        cout << *((*it).val) << ", ";
    }

    cout << endl;
}

int main() {
    vector<Node> v;

    // Creating a dummy vector
    v.push_back(Node()); v[0].val = new int(0);
    v.push_back(Node()); v[1].val = new int(10);
    v.push_back(Node()); v[2].val = new int(20);
    v.push_back(Node()); v[3].val = new int(30);
    v.push_back(Node()); v[4].val = new int(40);
    v.push_back(Node()); v[5].val = new int(50);
    v.push_back(Node()); v[6].val = new int(60);

    cout << "Vector before insertion - ";
    printVector(v); // Prints - 0, 10, 20, 30, 40, 50, 60,

    // Insert the element of given index to the beginning
    v.insert(v.begin(), std::move(v[4]));

    cout << "Vector after insertion - ";
    printVector(v); // Prints - 30, 0, 10, 20, 30, 40, 50, 60,
    // Why did 30 get inserted at the beggning and not 40?

    return 0;
}

Идеальная ссылка - https://ideone.com/7T9ubT

Теперь я знаю, что если написать по-другому, я получу правильное значение. Но что я конкретно хочу знать, так это почему это не сработало -

v.insert(v.begin(), std::move(v[4]));

И как (в моем коде выше) значение 30 было вставлено в начало вектора? Заранее спасибо! :)

1 Ответ

4 голосов
/ 08 июня 2019

v[4] - ссылка на элемент вектора.insert делает недействительными все ссылки и итераторы для элементов после точки вставки (все они в вашем примере).Таким образом, вы получаете неопределенное поведение - ссылка больше не действует где-то внутри функции insert.

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