Хранение данных неизвестного размера в C ++ - PullRequest
4 голосов
/ 29 октября 2009

Я использую PHP около 4 лет, однако я столкнулся с проблемой, которая требует чего-то с немного (: P) лучшей производительностью, и поэтому я выбрал C ++.

Программа, которую я пишу, - это демон Linux, который будет сканировать базу данных MySQL для загрузки URL-адресов, загружать их с помощью cURL, искать указанную строку и затем соответствующим образом обновлять базу данных. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю размера данных, которые необходимо сохранить в переменной для поиска конкретной строки.

У меня была идея использовать связанный список и выделить больше узлов, когда данные заполняют список. Это хороший способ заниматься делами?

Заранее спасибо,

Ответы [ 3 ]

6 голосов
/ 29 октября 2009

в 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);

Конечно, «строка» может быть любым типом данных, который вы хотите, и вы можете получить доступ к данным, используя Data [0], чтобы вернуть первую строку, и вы можете использовать Data.size (), чтобы вернуть количество строк в вектор / массив.

for(int x = 0; x != Data.size(); x++)
{
   //Do what you want with the data here using Data[x]
}
2 голосов
/ 29 октября 2009

Как правило, вы хотите использовать один из стандартных контейнеров. Мое личное предложение 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());

Отредактировано для корректности.

1 голос
/ 29 октября 2009

Тебе здесь есть, что открыть.

Вы должны специально ориентировать свое открытие на STL: используйте C ++ reference

Теперь вы должны попытаться научиться использовать:

  • std::vector
  • std::string
  • std::cin и std::cout (глобальные)

На std::string вы должны отметить большое количество алгоритмов, таких как find, find_first_of, find_last_of.

Обратите внимание, что манипуляции со строками в C ++ могут быть довольно сложными (как в многословном).

Если вам удобны регулярные выражения, вы можете попробовать Boost.Regex . Обратите внимание, что вы должны связаться с его библиотекой.

Кроме того, если вы пришли из PHP и хотите повысить производительность, вы могли бы начать с множества разных языков сценариев (Python - мой любимый), и это, вероятно, будет проще.

...