Как значение вектора сохраняется после того, как переменная выходит из области видимости? - PullRequest
0 голосов
/ 12 октября 2018

Назначение вектора локальной переменной для map<int , std::vector<int>> m1 в foo (), в надежде, что значение s1 не будет доступно после выхода из области видимости.Но это не тот случай.Похоже, что элементы вектора хранятся в куче, а локальная переменная s1 хранится в стеке.когда s1 был сохранен в карте, похоже, что он выделил новую память кучи и скопировал в нее значения.Правильно ли мое понимание?Я печатаю адрес каждого элемента вектора в foo, а также адрес каждого элемента вектора на карте.

#include <iostream>
#include <map>
#include <set>
#include<vector>
using namespace std;


std::map<int , std::vector<int>> m1;

void foo(){
    vector<int> s1 = { 10, 20, 30, 40 };
    cout << "local var address: " << &s1 << "\n";
    cout << "Element address " << &s1[0] << "  " << &s1[1] << " "
         << &s1[3] << "  " << &s1[4] << "\n";
    m1[1] = s1;
}


int main() {
    foo();

    cout << "\nElement value and address in map:\n";
    for (auto it = m1[1].begin(); it != m1[1].end();it++) {
        cout << *it << " " << &m1[1][*it] << "\n";  
    }

    return 0;
}

output:

local var address: 0x7fff41714400
Element address 0xc07c20  0xc07c24 0xc07c2c  0xc07c30

Element value and address in map:
10 0xc08cc8
20 0xc08cf0
30 0xc08d18
40 0xc08d40

Ответы [ 2 ]

0 голосов
/ 12 октября 2018
std::map<int , std::vector<int>>

имеет value_type из std::vector<int>.Это означает, что каждый элемент, хранящийся на карте, содержит такой векторный объект.

Он не содержит ссылку на вектор или указатель на вектор, на самом деле это объект.

Это означает, что если вы создаете вектор вне карты и назначаете его элементу карты, его необходимо переместить или скопировать.

0 голосов
/ 12 октября 2018

Когда вы делаете m1[1] = s1;, вы звоните m1[1] оператору присваивания .Если вы переходите по этой ссылке, вы вызываете первый экземпляр, который cppreference описывает как:

1) Оператор копирования.Заменяет содержимое копией содержимого другого.

(выделено мной)

Итак, вы смотрите наадреса двух совершенно разных векторов и двух совершенно разных наборов предметов.Нет смысла сравнивать их.

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