Лучший способ извлечь подвектор из вектора?

** Предупреждение: подход, описанный в этом ответе, применим только к очень конкретным сценариям и не является безопасным, поскольку атаки 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, история , браузера или любой другой конфиденциальной информации, поэтому вы можете иметь дело с ними позже, запретив их учетную запись или контактные органы.

274
задан Yamaneko 9 May 2013 в 19:09
поделиться

7 ответов

vector<T>::const_iterator first = myVec.begin() + 100000;
vector<T>::const_iterator last = myVec.begin() + 101000;
vector<T> newVec(first, last);

Это - O (N) операция для построения нового вектора, но нет действительно лучшего пути.

342
ответ дан Greg Rogers 23 November 2019 в 02:11
поделиться

Единственный способ спроектировать набор, который не является линейным временем, состоит в том, чтобы сделать так лениво, где получающийся "вектор" является на самом деле подтипом, который делегирует к исходному набору. Например, Scala List#subseq метод создает подпоследовательность в постоянное время. Однако это только работает, если набор неизменен и если базовая спортивная сборка "мусора" языка.

1
ответ дан Daniel Spiewak 23 November 2019 в 02:11
поделиться

Если оба не будут измененными (никакие объекты добавления/удаления - изменение существующих прекрасно, пока Вы принимаете во внимание поточную обработку проблем), можно просто раздать data.begin() + 100000 и data.begin() + 101000 и притвориться, что они begin() и end() из меньшего вектора.

Или, так как векторное устройство хранения данных, как гарантируют, будет непрерывно, можно просто раздать 1 000 массивов объекта:

T *arrayOfT = &data[0] + 100000;
size_t arrayOfTLength = 1000;

Оба этих метода занимают время, но требуют, чтобы длина данных не увеличивалась, инициировав перераспределение.

10
ответ дан Eclipse 23 November 2019 в 02:11
поделиться

std::vector(input_iterator, input_iterator), в Вашем случае foo = std::vector(myVec.begin () + 100000, myVec.begin () + 150000);, посмотрите, например здесь

24
ответ дан e19293001 23 November 2019 в 02:11
поделиться

Просто используйте векторного конструктора.

std::vector<int>   data();
// Load Z elements into data so that Z > Y > X

std::vector<int>   sub(&data[100000],&data[101000]);
84
ответ дан Martin York 23 November 2019 в 02:11
поделиться

Можно использовать копия STL с O (M) производительность, когда M является размером подвектора.

3
ответ дан Yuval F 23 November 2019 в 02:11
поделиться

Это обсуждение довольно старо, но самый простой еще не упоминается, с инициализация списка :

 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;
0
ответ дан 23 November 2019 в 02:11
поделиться
Другие вопросы по тегам:

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