C ++: как удалить элемент из вектора, который имеет определенное значение [duplicate]

Типы ссылок по умолчанию равны null, чтобы указать, что они не ссылаются на какой-либо объект. Следовательно, если вы попытаетесь получить доступ к объекту, на который ссылаетесь, а его нет, вы получите исключение NullReferenceException.

Для Ex:

SqlConnection connection = null;
connection.Open();

Когда вы запускаете это кода, вы получите:

System.NullReferenceException: Object reference not set to an instance of an object.

Вы можете избежать этой ошибки, например, следующим образом:

if (connection != null){
    connection.Open();
}

Примечание. Чтобы избежать этой ошибки, вы всегда должны инициализировать свои объекты прежде чем пытаться что-либо сделать с ними.

11
задан Sam 3 October 2011 в 08:10
поделиться

3 ответа

Вы можете использовать Erase-remove idiom для std :: vector

Цитата:

std::vector<int> v; 
// fill it up somehow
v.erase(std::remove(v.begin(), v.end(), 99), v.end()); 
// really remove all elements with value 99

Или, убедитесь, что он уникален, просто перебирайте вектор и стирайте найденный элемент. Что-то вроде:

for( std::vector<T>::iterator iter = v.begin(); iter != v.end(); ++iter )
{
    if( *iter == VALUE )
    {
        v.erase( iter );
        break;
    }
}
17
ответ дан Kiril Kirov 27 August 2018 в 01:19
поделиться

Основываясь на ответе Кирилла, вы можете использовать эту функцию в своем коде:

template<typename T>
inline void remove(vector<T> & v, const T & item)
{
    v.erase(std::remove(v.begin(), v.end(), item), v.end());
}

И использовать его так

remove(myVector, anItem);
1
ответ дан 56ka 27 August 2018 в 01:19
поделиться

Если вхождения уникальны, вы должны использовать std::set<T>, а не std::vector<T>.

Это добавило преимущество функции erase-члена, которая делает то, что вы хотите.

Посмотрите, как использование правильного контейнера для задания дает вам более выразительные инструменты?

#include <set>
#include <iostream>

int main()
{
   std::set<int> notAList{1,2,3,4,5};

   for (auto el : notAList)
      std::cout << el << ' ';
   std::cout << '\n';

   notAList.erase(4);

   for (auto el : notAList)
      std::cout << el << ' ';
   std::cout << '\n';
}

// 1 2 3 4 5
// 1 2 3 5

Live demo

2
ответ дан Lightness Races in Orbit 27 August 2018 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: