在C ++中存储未知大小的数据

时间:2009-10-29 14:27:27

标签: c++ variables curl linked-list dynamic-memory-allocation

我已经使用PHP大约4年了,但是我遇到了一个问题需要稍微((P)更好的性能,所以我选择了C ++。

我正在编写的程序是一个Linux守护程序,它将扫描MySQL数据库以获取要加载的URL,使用cURL加载它们,搜索指定的字符串,然后相应地更新数据库。我面临的问题是,我不知道需要存储在变量中的数据大小,以便搜索特定的字符串。

我想到了使用链表并在数据填充列表时分配更多节点。这是一个做事的好方法吗?

提前致谢,

3 个答案:

答案 0 :(得分:6)

在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]
}

答案 1 :(得分:2)

通常,您可能希望使用其中一个标准容器。我个人的建议是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());

编辑正确。

答案 2 :(得分:1)

你可以在那里发现很多东西。

您应该专门将发现定位到STL:使用C++ reference

现在你应该尝试学习如何使用:

  • std::vector
  • std::string
  • std::cinstd::cout(全局)

std::string上,你应该注意到很多算法,例如findfind_first_offind_last_of

请注意,C ++中的字符串操作非常具有挑战性(如详细说明)。

如果您对正则表达式感到满意,则可能愿意尝试Boost.Regex。请注意,您必须链接到其库。

另外,如果你来自PHP并希望提高性能,你可以从许多不同的脚本语言开始(Python是我最喜欢的),它可能会更容易。