Хранение данных неизвестного размера в C++
-
10-07-2019 - |
Вопрос
Я использую PHP около 4 лет, однако столкнулся с проблемой, требующей чего-то с немного (:P) большей производительностью, и поэтому я выбрал C++.
Программа, которую я пишу, представляет собой демон Linux, который сканирует базу данных MySQL на наличие URL-адресов для загрузки, загружает их с помощью cURL, выполняет поиск указанной строки и затем соответствующим образом обновляет базу данных.Проблема, с которой я столкнулся, заключается в том, что я не знаю размера данных, которые необходимо сохранить в переменной для поиска определенной строки.
У меня возникла идея использовать связанный список и выделять больше узлов по мере заполнения списка данными.Это хороший способ делать что-то?
Заранее спасибо,
Решение
в c ++ векторный класс может хранить объем данных неизвестного размера.
#include <string>
#include <vector>
std::vector <std::string>Data;
std::string newData = "a String";
Data.push_back(newData);
std::string otherData = "a different String";
Data.push_back(otherData);
Конечно, 'string' может быть любой тип данных, который вы хотите, и вы можете получить доступ к данным, используя Data [0], чтобы вернуть первую строку, и вы можете использовать Data.size (), чтобы вернуть количество строк в вектор / массив.
for(int x = 0; x != Data.size(); x++)
{
//Do what you want with the data here using Data[x]
}
Другие советы
Как правило, вы хотите использовать один из стандартных контейнеров. Мое личное предложение: std :: vector
. Вы можете использовать его в качестве массива (так как данные гарантированно будут смежными), и он имеет удобные операции индексации и вставки (кажется, что вы не заинтересованы в удалении в данный момент).
В частности, вы можете настроить что-то вроде
std::vector<char> buff;
// while you are reading data
buff.push_back (item);
Когда вы закончите, вы можете вызвать buff.size
, чтобы узнать, сколько вы прочитали.
В качестве дополнительного бонуса (если вы на самом деле имеете дело с буферами символов), когда вы, наконец, получите все необходимые данные, вы можете преобразовать их в std :: string
, чтобы выполнить любой поиск, который вы хотите делать.
std::vector<char> buff;
buff.push_back('e');
buff.push_back('a');
buff.push_back('t');
std::string s(&buff[0], buff.size());
Отредактировано для корректности.
Там вам предстоит многое открыть.
Вам следует специально ориентировать свое открытие на STL:использовать Справочник по С++
Теперь вам следует попробовать научиться использовать:
std::vector
std::string
std::cin
иstd::cout
(глобальные)
На std::string
вы должны отметить большое количество алгоритмов, таких как find
, find_first_of
, find_last_of
.
Обратите внимание, что манипуляции со строками в C++ могут быть довольно сложными (например, многословными).
Если вы знакомы с регулярными выражениями, возможно, вы захотите попробовать Boost.Регулярное выражение.Обратите внимание, что вам необходимо подключиться к его библиотеке.
Кроме того, если вы пришли с PHP и хотите повысить свою производительность, вы можете начать с множества разных языков сценариев (мой любимый — Python), и это, вероятно, будет проще.