C ++ пытается поменять значения в векторе - PullRequest
44 голосов
/ 03 июня 2011

Это моя функция подкачки:

template <typename t>
void swap (t& x, t& y)
{
    t temp = x;
    x = y;
    y = temp;
    return;
}

И это моя функция (на боковой ноте v хранит строки) для вызова значений подкачки, но всякий раз, когда я пытаюсь вызвать используя значения в векторе,ошибка.Я не уверен, что я делаю неправильно.

swap(v[position], v[nextposition]); //creates errors

Ответы [ 4 ]

98 голосов
/ 05 ноября 2013

Я думаю, что вы ищете iter_swap, который вы также можете найти в <algorithm>.
все, что вам нужно сделать, это просто передать два итератора, каждый указывая на один из элементовВы хотите обменять.
, так как у вас есть позиция двух элементов, вы можете сделать что-то вроде этого:

// assuming your vector is called v
iter_swap(v.begin() + position, v.begin() + next_position);
// position, next_position are the indices of the elements you want to swap
40 голосов
/ 19 марта 2014

Обе предложенные возможности (std::swap и std::iter_swap) работают, они просто имеют немного другой синтаксис. Давайте поменяем местами первый и второй элемент вектора, v[0] и v[1].

Мы можем поменять местами на основе содержимого объектов:

std::swap(v[0],v[1]);

Или подкачка на основе базового итератора:

std::iter_swap(v.begin(),v.begin()+1);

Попробуйте:

int main() {
  int arr[] = {1,2,3,4,5,6,7,8,9};
  std::vector<int> * v = new std::vector<int>(arr, arr + sizeof(arr) / sizeof(arr[0]));
  // put one of the above swap lines here
  // ..
  for (std::vector<int>::iterator i=v->begin(); i!=v->end(); i++)
    std::cout << *i << " ";
  std::cout << std::endl;
}

Оба раза вы меняете первые два элемента местами:

2 1 3 4 5 6 7 8 9
21 голосов
/ 03 июня 2011

Есть std::swap в <algorithm>

4 голосов
/ 30 марта 2015

после передачи вектора по ссылка

swap(vector[position],vector[otherPosition]);

даст ожидаемый результат.

...