2016-08-09 9 views
0

Что проводным я вижу здесь с стандом вектором У меня есть переменные, ее значение динамически изменяется, но всегда под 20 dynamicSizeToInsert в примере. Почему размер вектора растет?станда вектор размера держать землю Хотя я вставить в том же индексируешь

std::vector<int> v; 
//sometimes its 5 sometimes it is 10 sometimes it is N < 20 
int dynamicSizeToInsert = 5 
int c = 0; 
for(std::vector<int>::size_type i = 0; i != 100; i++) { 
    if(c == dynamicSizeToInsert) 
    { 
     c = 0; 
    } 
    v.insert(v.begin() + c, c); 
    c++; 

    printf("%d",v.size()) //THIS THINK KEEP growing although i only using vector indexes 0 to 4 allways 
} 

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

+2

Перечитайте описание того, что вектор :: вставка делает. – 1201ProgramAlarm

+0

o дерьмо это просто держит его растущим .. спасибо, какая лучшая альтернатива? – user63898

+0

@ user63898, если вы просто хотите перезаписать существующие записи, используйте старый пользовательский доступ 'operator []', т. Е. 'V [i]'. –

ответ

1

std::vector::insert, как следует из названия, Вставки элементов в указанном положении.

Когда c == dynamicSizeToInsert, c установлено на 0. Итак, v.size() == 5. Теперь эти строки выполняет:

v.insert(v.begin() + c, c); 

Это вставит 0 в posistion v.begin() + 0, что позиция 0 и он будет компенсировать любой другой элемент (он будет не заменить элемент в позиции 0), и поэтому вектор сохраняет растет.


Вместо использования insert используйте operator[]:

//So that 'v' is the right size 
v.resize(dynamicSizeToInsert); 

for(std::vector<int>::size_type i = 0; i != 100; i++) { 
    if(c == dynamicSizeToInsert) 
    { 
     c = 0; 
    } 

    v[i] = c; //Sets current index to 'c' 
    c++; 
} 
+0

Изменение размера сначала очень важно! – user63898

+0

@ user63898 Да, или вы попытаетесь получить доступ к нераспределенной памяти :) – Rakete1111

1

станд :: вектор :: вставки вставляет новый элемент в массив индекса вы укажете, и перемещая другие элементы вперед или даже перераспределить массив, когда он достигает мощности (относительно дорогая операция)

Вектор расширяется путем вставки новых элементов перед элементом в указанной позиции, эффективно увеличивая размер контейнера на количество вставленных элементов.

Это приводит к автоматическому перераспределению выделенного пространства для хранения , если - и только если - новый размер вектора превышает текущий вектор . (http://www.cplusplus.com/reference/vector/vector/insert/)

Как указано выше, вектор расширяется с каждой операции вставки. , чтобы получить требуемое поведение нужно использовать оператор [], как так:

v[i] = some_new_value; 

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

1

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

Если вы хотите заменить существующий указатель, вы можете использовать operator[]. Однако имейте в виду, что индекс должен быть между 0 - size() - 1, чтобы использовать operator[].

0
const int dynamicSizeToInsert = 5; 
std::vector<int> v(dynamicSizeToInsert); 
int c = 0; 
for(std::vector<int>::size_type i = 0; i !=100; i++) 
{ 
    v.at(i%dynamicSizeToInsert) = (dynamicSizeToInsert == c?c = 0,C++: C++); 

    printf("%d",v.size()); 
} 
+1

Ответы только на код не рекомендуются, было бы лучше включить некоторые объяснения. – SurvivalMachine

+0

Спасибо за советы –

 Смежные вопросы

  • Нет связанных вопросов^_^