Member 13527256 Ответов: 1

Вектор не изменяет элементы


Я должен добавить новый элемент и переместить некоторые другие в моем векторе в этой программе \/, но векторные элементы вообще не хотят меняться.

#include <iostream>
#include <deque>

using namespace std;

int main()
{
	int n;
	cin >> n;
    vector <int> v;
    for (auto i = 0, j = 0; i < n; i++)
    {
    	cin>>j;
        v.push_back(j);
    }
    //
    int max = 0, ind = 0;
    for (auto i:v)
    	if (max <= i)
        {     	
        	max = i;
        	ind = i;
        }
    //
    v.push_back(0);
    for (auto i = n, j =0; i > ind+1; i--)
    {    	j = v[i]; -----this code does not work
          v[i] = v[i-1];-------this code does not work
          v[i-1] = j;----------this code does not work
    }
    v[ind+1] = v[ind];--------- this code does not work
    //
   for (auto i:v)
    	      cout << i << ' ';
  	cout << endl;
	return 0;
}

Я знаю, это может показаться смешным, но это так!
Пример ввода данных:
3
3 1 1
Ожидаемый результат:
3 3 1 1
Реальный объем производства:
3 1 1 0

Что я уже пробовал:

прочтите несколько статей о векторном типе в Сети;
пробовал использовать функцию swap (), но она тоже не работает;
попробовал использовать deque или queue вместо vector - тот же результат;
я думаю, что этот код должен работать, и не знаю, почему он этого не делает.

Richard MacCutchan

Пройдитесь по коду с помощью отладчика и посмотрите, почему.

1 Ответов

Рейтинг:
5

Patrice T

Цитата:
я думаю, что этот код должен работать, и не знаю, почему он этого не делает.

Запускайте отладчик, на каждом шаге проверяйте, все ли в порядке.
for (auto i = n, j =0; i > ind+1; i--)

Используете ли вы максимальное значение в векторе в качестве конечной позиции в цикле ?
Если это не будет тщательно спланировано, вас ждут большие неприятности.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Member 13527256

Спасибо - вчера я работал допоздна и забыл про отладчик) Собственно, проблема была вот в чем:
для (auto i:v)
если (max <= i)
{
Макс = i;
ind = i;
}
ind должен быть увеличен на 1 на каждой итерации здесь.

Patrice T

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