2013-07-17 1 views
4

Мне нужен индексный доступ к моему std::vector, поэтому я должен проверить, доступен ли индекс для их первого удаления, а затем установить новое значение.Проверьте, существует ли данный индекс в std :: vector

Вот мой сеттер функция:

void SetVector(int position, int value) { 
    std::vector<int>iterator it = testVector.begin(); 
    // need a check here 
    testVector.insert(it-testVector.begin()+position, value); 
} 

Или это неправильно C++ коллекция для моих потребностей? (должен расти динамически, поэтому нет std:array). Можно использовать std::map, но возможно это также возможно с std::vector.

+2

То, что вы описали в тексте лучше всего было бы сделать, говоря, 'если (положение jogojapan

+0

Вы хотите вставить новый элемент или изменить существующее значение? – doctorlove

+0

Вставьте, если индекс не установлен или если он установлен, сначала удалите его и сохраните новое значение в этом положении! – leon22

ответ

0

сначала получить итератор для вашего вектора с помощью

std::vector<int>::iterator it; 

it = myvector.begin();

for (it=myvector.begin(); it<myvector.end(); it++) 
    std::cout << ' ' << *it; 

Использование Thsi итератора вы можете пройти все элементы и выполнять соответствующую операцию, как удалить элемент

1

Вы можете использовать std::vector::at, которые выдают исключение, если у вас ничего нет в этом индексе.

Функция автоматически проверяет, является ли п в пределах действительных элементов в векторе, выбрасывая исключение out_of_range, если он не (то есть, если п больше или равно, чем его размера). Это в контрастирует с оператором-членом [], который не проверяет границы.

И так как вы получите ссылку на объект по данному индексу, вы можете изменить/удалить значение

void SetVector(int position, int value) { 
    try 
    { 
     testVector.at(position) = value; 
    } 
    catch (const std::out_of_range& oor) { 
     testVector.resize(position + 1); 
     testVector[position] = value; 
    } 
} 
+1

Вам нужно изменить размер (позиция + 1) ', а не' reserve (position) ', чтобы сделать' position' действительным индексом. –

+0

@MikeSeymour http://ideone.com/oh7Hf5 он работает, я не понимаю. Потому что я вижу, что вы спорите с push_back и все, но мы действительно не знаем, что op хочет делать с этим массивом. – Alexis

+0

Это не «работает». Ваш код записывается за пределы вектора, что дает неопределенное поведение - это, конечно, не то, что хочет OP. Если он не изменен по меньшей мере на 'position + 1',' position' не является допустимым индексом. –

6

Я не считаю, что вопрос ясен. Если вы хотите, чтобы сначала удалить их, а затем установить новое значение.

.

это может работать

void SetVector(int position, int value) { 
    if (position < testVector.size()) { 
     testVector[position] = value; 
    } 
    else { 
     testVector.push_back(value); 
    } 
} 

Вы должны действительно сделать int positiontestVector «s size_type.

+0

+1 для поднятия 'size_type'. 'push_back', конечно, будет игнорировать' position'. Не уверен, что это предназначено. – jogojapan

+0

@jogojapan re push_back ... Я знаю, но в комментарии говорится: «Вставьте, если индекс не установлен», что может означать что угодно. – doctorlove

+0

Абсолютно. Мой комментарий был просто для того, чтобы рассказать об этом. – jogojapan

7

Требования не совсем понятны из вопроса, но я предполагаю, что вы хотите получить testVector[position] == value, независимо от того, находился ли он или нет position.

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

if (position >= testVector.size()) { 
    testVector.resize(position+1); 
} 

Затем назначьте элемент, который вы хотите установить:

testVector[position] = value; 
+1

Извините, но я должен уменьшить это. 'resize()' будет вставлять элемент по умолчанию, который вы затем перезаписываете со значением, которое вы действительно хотите. Гораздо лучше использовать 'push_back()'. – TemplateRex

+0

@TemplateRex: 'push_back()' не обязательно будет вставлять его в нужную позицию, так что это было бы неправильно. Это самый простой способ сделать то, что OP хочет; Я добавлю альтернативу, когда вы действительно хотите избежать затрат на вставку и перезапись элемента. –

+0

tnx для обновления! +1 сейчас – TemplateRex

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