C++ 使用文本文件中的值实现AVL树
我试图通过使用文本文件中的键/值对来实现AVL树。例如,(000309390,Vegas)将是一个这样的键值对,0003是键,09390,Vegas是值。我对如何提取每个项目感到困惑。我希望000309390和Vegas作为每个单独的变量存储在一个结构中 我建议使用结构来保存值:C++ 使用文本文件中的值实现AVL树,c++,avl-tree,C++,Avl Tree,我试图通过使用文本文件中的键/值对来实现AVL树。例如,(000309390,Vegas)将是一个这样的键值对,0003是键,09390,Vegas是值。我对如何提取每个项目感到困惑。我希望000309390和Vegas作为每个单独的变量存储在一个结构中 我建议使用结构来保存值: struct Values { std::string value; // such as 09390 std::string city; // such as "Vegas" }; 接下来,重载提取操作符
struct Values
{
std::string value; // such as 09390
std::string city; // such as "Vegas"
};
接下来,重载提取操作符:
struct Values
{
std::string value; // such as 09390
std::string city; // such as "Vegas"
friend std::istream& operator>>(std::istream& inp, Values& v);
};
std::istream& operator>>(std::istream& inp, Values& v)
{
inp >> v.value;
// insert code to skip over delimiter.
inp >> v.city;
return inp;
}
您的输入循环可能如下所示:
std::string key;
std::string delimiter;
Values v;
AVL tree;
//...
while (input_file >> key >> delimiter >> v)
{
tree[key] = v;
}
注:上述输入表达式仅在值为而不是空格或制表符分隔时有效
有关读取文件的详细信息,请在StackOverflow中搜索:
- “c++读取文件结构”
- “c++读取文件csv”
ignore()
与std::getline()
结合使用:
std::字符串键,代码,城市;
if(in.ignore(std::numeric_limits::max(),'('))
&&std::getline(输入,键“,”)
&&std::getline(in,代码,,)
&&std::getline(在城市中,“)”){
// ...
}
如果您的文本文件是结构良好的数据(看起来像),那么学习如何使用scanf
读取非常有用。如果它足够简单,cin/getline
将完成这项工作。@VillasV我不建议使用scanf
std::getline
和stringstream
是一个更好的解决方案。@erip是的,其他用户已经对我大喊大叫,因为我向新用户推荐了scanf
。不过我看不出有什么不对,它非常适合结构化数据。如果数据不是结构良好的,我会建议反对。<代码> SCANF不是惯用的C++。可悲的是,读<代码> STD::String < /C> >将空白作为分隔符。因此,阅读key
可以阅读全部内容。是的,我打算写一个关于这一点的注释。当项目没有空间分隔时,此操作有效。
std::string key, code, city;
if (in.ignore(std::numeric_limits<std::streamsize>::max(), '(')
&& std::getline(in, key, ',')
&& std::getline(in, code, ',')
&& std::getline(in, city, ')')) {
// ...
}