Как проверить, содержит ли вектор определенный символ в указанных индексах?

Текущий API таков:

  • flatten всегда возвращает копию.
  • ravel , когда это возможно, возвращает представление исходного массива. Это не видно на распечатанном выходе, но если вы измените массив, возвращаемый ravel, он может изменить записи в исходном массиве. Если вы измените записи в массиве, возвращенном из сглаживания, этого никогда не произойдет. ravel часто будет быстрее, поскольку копия памяти не будет скопирована, но вы должны быть более осторожны при изменении возвращаемого массива.
  • reshape((-1,)) получает представление всякий раз, когда шаги array, даже если это означает, что вы не всегда получаете смежный массив.

1
задан Jesper Juhl 3 March 2019 в 16:09
поделиться

5 ответов

Алгоритмы от стандартных берут итераторы, а не контейнеры, так что вы можете использовать их:

auto it = std::find(a.begin(), a.begin() + 2, 'b');
if (it != a.begin() + 2) {
    // found.
}
0
ответ дан Jarod42 3 March 2019 в 16:09
поделиться
#include<vector>
#include<iostream>
using namespace std;
int main(){
     vector<char> A;
     //initialize your vector here
     unsigned i;
     unsigned start, stop;
     //initialize the start and stop here
     for(i=start; i<stop; i++){
         if(A[i]=='b'){
             cout<<"character found!"<<endl;
             break;
         }
     }
}
0
ответ дан brightprogrammer 3 March 2019 в 16:09
поделиться

С этими определениями:

vector<char> a = {'a', 'b', 'c', 'd', 'e', 'f' /*...*/};
char ch = 'x';  

Вы можете легко перейти к следующему, начиная с первого символа (+1) и заканчивая игнорированием двух последних элементов (-2):

if (any_of(a.cbegin()+1, a.cend()-2, [&ch](auto &x){return x==ch; }))
    cout << "found !"<<endl; 
else cout << "not found! "<<endl; 

Вы также можете использовать более классический std::find() в библиотеке <algorithm> :

if (std::find(a.cbegin(), a.cend(), ch) !=a.cend()) 
   ...

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

if (std::find(a.cbegin()+3, a.cend(), ch) != a.cend()) 
    ...

Если вы делаете это часто, и вам не интересно, где в векторе находится элемент найдено, вы можете рассмотреть следующую функцию:

template <class U, class W> 
bool myfind (const  U &v, size_t starto, size_t endo, const W& x) {
    if (starto>=endo || endo>=v.size())
        return false; 
    return std::find(v.begin()+starto, v.begin()+endo, x) != v.begin()+endo;
}

Если вы можете перейти к std::string вместо std::vector, вы можете использовать функцию-член find() , которая может принимать смещение в качестве аргумента.

0
ответ дан Christophe 3 March 2019 в 16:09
поделиться

Пока вы работаете с несортированным контейнером (std::vector - один), я бы попросил std::any_of выразить ваше намерение. Он будет иметь такую ​​же эффективность, как std::find

#include <vector>
#include <algorithm>

int main()
{
    std::vector<char> a{'a', 'b', 'c', 'd', 'e', 'f'};
    // Checks range between 'b'...'d'
    if (std::any_of(a.begin() + 1, a.end() - 2, [](char c){return c == 'b';})) {
      // do stuff
    }
    return 0;
}
0
ответ дан R2RT 3 March 2019 в 16:09
поделиться

Другие правы в том, что, поскольку алгоритмы используют итераторы, у вас есть много гибкости здесь.

Вот мой вариант.

Я придерживаюсь std::find, потому что std::any_of добавляет сложности, не добавляя ясности.

std::vector<char> a{'a', 'b', 'c', 'd', 'e', 'f', /*...*/};

assert(a.size() >= 2);
const auto start  = a.cbegin();
const auto end    = a.cbegin() + 2;

const char search = 'b';

if (auto it = std::find(start, end, search); it != end)
{
   std::cout << "Found '" << search << "'!\n";
}

( Здесь больше о новой конструкции if ; отступите от синтаксиса старой школы, если вы до C ++ 17.) [119 ]

0
ответ дан Lightness Races in Orbit 3 March 2019 в 16:09
поделиться
Другие вопросы по тегам:

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