** Предупреждение: подход, описанный в этом ответе, применим только к очень конкретным сценариям и не является безопасным, поскольку атаки SQL-инъекции не только полагаются на возможность вставлять X=Y
. **
Если злоумышленники пытаются взломать форму с помощью переменной PHP $_GET
или с помощью строки запроса URL, вы сможете поймать их, если они не защищены.
RewriteCond %{QUERY_STRING} ([0-9]+)=([0-9]+)
RewriteRule ^(.*) ^/track.php
Поскольку 1=1
, 2=2
, 1=2
, 2=1
, 1+1=2
и т. д. ... являются распространенными вопросами к базе данных SQL злоумышленника. Возможно, он также используется многими хакерскими приложениями.
Но вы должны быть осторожны, чтобы не переписывать безопасный запрос с вашего сайта. Вышеупомянутый код дает вам возможность переписать или перенаправить (зависит от вас) эту динамическую строку запроса, зависящую от хакерства, на страницу, в которой будет храниться IP-адрес злоумышленника или EVEN THEIR COOKIES, история , браузера или любой другой конфиденциальной информации, поэтому вы можете иметь дело с ними позже, запретив их учетную запись или контактные органы.
vector<T>::const_iterator first = myVec.begin() + 100000;
vector<T>::const_iterator last = myVec.begin() + 101000;
vector<T> newVec(first, last);
Это - O (N) операция для построения нового вектора, но нет действительно лучшего пути.
Единственный способ спроектировать набор, который не является линейным временем, состоит в том, чтобы сделать так лениво, где получающийся "вектор" является на самом деле подтипом, который делегирует к исходному набору. Например, Scala List#subseq
метод создает подпоследовательность в постоянное время. Однако это только работает, если набор неизменен и если базовая спортивная сборка "мусора" языка.
Если оба не будут измененными (никакие объекты добавления/удаления - изменение существующих прекрасно, пока Вы принимаете во внимание поточную обработку проблем), можно просто раздать data.begin() + 100000
и data.begin() + 101000
и притвориться, что они begin()
и end()
из меньшего вектора.
Или, так как векторное устройство хранения данных, как гарантируют, будет непрерывно, можно просто раздать 1 000 массивов объекта:
T *arrayOfT = &data[0] + 100000;
size_t arrayOfTLength = 1000;
Оба этих метода занимают время, но требуют, чтобы длина данных не увеличивалась, инициировав перераспределение.
std::vector(input_iterator, input_iterator)
, в Вашем случае foo = std::vector(myVec.begin () + 100000, myVec.begin () + 150000);
, посмотрите, например здесь
Просто используйте векторного конструктора.
std::vector<int> data();
// Load Z elements into data so that Z > Y > X
std::vector<int> sub(&data[100000],&data[101000]);
Можно использовать копия STL с O (M) производительность, когда M является размером подвектора.
Это обсуждение довольно старо, но самый простой еще не упоминается, с инициализация списка :
vector<int> subvector = {big_vector.begin() + 3, big_vector.end() - 2};
Это требует C++ 11 или выше.
использование В качестве примера:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
vector<int> big_vector = {5,12,4,6,7,8,9,9,31,1,1,5,76,78,8};
vector<int> subvector = {big_vector.begin() + 3, big_vector.end() - 2};
cout << "Big vector: ";
for_each(big_vector.begin(), big_vector.end(),[](int number){cout << number << ";";});
cout << endl << "Subvector: ";
for_each(subvector.begin(), subvector.end(),[](int number){cout << number << ";";});
cout << endl;
}
Результат:
Big vector: 5;12;4;6;7;8;9;9;31;1;1;5;76;78;8;
Subvector: 6;7;8;9;9;31;1;1;5;76;