Текущий API таков:
flatten
всегда возвращает копию. ravel
, когда это возможно, возвращает представление исходного массива. Это не видно на распечатанном выходе, но если вы измените массив, возвращаемый ravel, он может изменить записи в исходном массиве. Если вы измените записи в массиве, возвращенном из сглаживания, этого никогда не произойдет. ravel часто будет быстрее, поскольку копия памяти не будет скопирована, но вы должны быть более осторожны при изменении возвращаемого массива. reshape((-1,))
получает представление всякий раз, когда шаги array, даже если это означает, что вы не всегда получаете смежный массив. Алгоритмы от стандартных берут итераторы, а не контейнеры, так что вы можете использовать их:
auto it = std::find(a.begin(), a.begin() + 2, 'b');
if (it != a.begin() + 2) {
// found.
}
#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;
}
}
}
С этими определениями:
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()
, которая может принимать смещение в качестве аргумента.
Пока вы работаете с несортированным контейнером (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;
}
Другие правы в том, что, поскольку алгоритмы используют итераторы, у вас есть много гибкости здесь.
Вот мой вариант.
Я придерживаюсь 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 ]