Проверьте, существует ли элемент в 2D-векторе - PullRequest
0 голосов
/ 06 мая 2018

Я вставил некоторые элементы в 2D-вектор и хочу узнать, присутствует ли данный элемент в 2D-векторе где-либо. Есть ли какой-нибудь быстрый способ найти наличие элемента?

Вектор объявлен как: vector < vector< int > > v;

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Если у вас нет дополнительной информации о 2D-векторе (например, как-то отсортировано), то лучшим способом будет итерация по каждой строке 2D-вектора и использование метода find для проверки, существует он или нет.

Вы делаете что-то вроде следующего:

bool does_exist(const vector< vector<int> >&  v, int item){

     vector< vector<int> >::const_iterator row;

    for (row = v.begin(); row != v.end(); row++) {
        if(find(row->begin(), row->end(), item) != row->end() )
            return true;
    }

    return false;
}

Вы можете проверить это с помощью следующего кода:

#include <iostream>
#include <vector>

using namespace std;

int main(){

    int item = 12;
    vector < vector <int> > v;
    vector <int> v1;

    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);

    vector <int> v2;

    v2.push_back(4);
    v2.push_back(5);
    v2.push_back(6);

    v.push_back(v1);
    v.push_back(v2);

    if( does_exist(v, item))
        cout << "Item " << item << " exist" << endl;
    else 
        cout << "Item " << item << " does not exist" << endl;
}
0 голосов
/ 06 февраля 2019

TL; DR

Используйте std :: find () .

В C ++ используйте функцию из Стандартная библиотека шаблонов (STL) , если она была предоставлена.

Разработка

Допустим, у вас есть двумерный вектор

std::vector<std::vector<int> > matrix = {
   {1,2,3}, 
   {4,5,6},
   {7,8,9}
};

И если вы хотите перебрать все элементы в 2d векторе выше.

Я рекомендую вам использовать 2d iterator:

bool element_exist(const vector< vector<int> >&  input, int key){
    // 2d vector iterator
    vector< vector<int> >::iterator row_it; //iterate over each row(s)
    vector<int>::iterator col_it; //iterate over column(s)
    for (row_it = input.begin(); row_it != input.end(); row_it++) { // iterate each row(s)
        for (col_it = row_it->begin(); row_it != row_it->end(); col_it++) {
            if(find(row_it->begin(), row_it->end(), key) != row_it->end())
                return true;
        }
    }
}

и вы можете использовать другую логическую переменную, чтобы получить возвращаемое значение функции key_exist

bool_var = element_exist(matrix, key);

Вся программа

#include <vector>
#include <iostream>
using namespace std;

bool element_exist(const vector< vector<int> >&  input, int key){
    // 2d vector iterator
    vector< vector<int> >::const_iterator row_it; //iterate over each row(s)
    vector<int>::const_iterator col_it; //iterate over column(s)
    for (row_it = input.begin(); row_it != input.end(); row_it++) { // iterate each row(s)
        for (col_it = row_it->begin(); row_it != row_it->end(); col_it++) {
            if(find(row_it->begin(), row_it->end(), key) != row_it->end())
                return true;
        }
    }
}

int main() {
    // declaration
    bool bool_var = false; // default false
    std::vector<std::vector<int> > matrix = {{1,2,3}, {4,5,6},{7,8,9}};

    bool_var = element_exist(matrix,1);
    cout << "bool_var: " << bool_var << endl;

    return 0;
}

Результат

bool_var: 1
0 голосов
/ 06 мая 2018

Не так элегантно, как я надеялся. Дан двумерный вектор целых чисел:

std::vector<std::vector<int>> foo = {
    {{1, 2, 3}},
    {{5, 6, 7}},
    {{8, 9, 13, 15}}
};

Вы можете сделать это, чтобы увидеть, присутствует ли 13:

bool found =
    find_if(foo.begin(), foo.end(),
            [](const std::vector<int>& v) -> bool {
                return find(v.begin(), v.end(), 13) != v.end();
            }) != foo.end();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...