Я оголосив векторну пару int і vector як vector<pair<int,vector<int> > v(10)
. Тепер я хочу використовувати чітку функцію як v[i].clear()
і очікуючи, що це очистить рядок v[i]
. Але компілятор видає помилку. Будь ласка, допоможіть мені правильно використовувати функцію clear (), щоб очистити певний рядок у такому векторному оголошенні або запропонуйте мені інший спосіб зробити це.
Відповіді:
0 для відповіді № 1Якщо ви хочете стерти i-й ряд, тоді вам потрібно стерти:
v.erase(v.begin() + i);
У вашому прикладі це зменшило б розмір вектора на одиницю, залишивши лише 9 елементів.
З іншого боку, якщо ви хочете повторно ініціалізувати i-й ряд, щоб він містив те саме, що робив, коли ви вперше створили вектор, щоб у ньому було 10 елементів, тоді вам потрібно:
v[i] = pair<int, vector<int> >();
- або
v[i].first = 0;
v[i].second.clear();
0 для відповіді № 2
Ваш зовнішній std::vector
містить std::pair
S і clear
є метод на std::vector
ні std::pair
. Схоже, ви можете це означати:
v[i].second.clear();
Якщо ви хочете видалити ціле яЕлемент від вектора, то це питання інше, ніж те, що ви задали. Замість цього ви можете видалити його таким чином:
v.erase(v.begin() + i);
Якщо ви хочете повністю скинути яth елемент, тоді вам слід побудувати таке значення за замовчуванням:
v[i] = pair<int, vector<int> >();
або так:
v[i] = std::make_pair(0, std::vector<int>());
Також зауважте, що дзвоніть clear
насправді не звільняє "зарезервований" простір всередині вектора, тому якщо ваш вектор дійсно великий і ви цього хочете справді позбудьтеся всієї пам'яті, тоді вам потрібно буде призначити порожній (побудований за замовчуванням) вектор. Як варіант, ви можете зателефонувати за допомогою ідіоми swap-with-empty:
v[i].second.swap(std::vector<int>());