C++ 使用文本文件中的值实现AVL树

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" }; 接下来,重载提取操作符

我试图通过使用文本文件中的键/值对来实现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"
  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, ')')) {
    // ...
}