-5

考虑我们已经声明了一个这样的字符串:string x;和一个这样的字符向量:vector<char> x_vec; 我在想这样做有什么好处

cout<<x;

超过

for(int i=0;i<x.length();i++)
      cout<<x[i];

或者

for(int i=0;i<x_vec.size();i++)
      cout<<x_vec[i];

性能方面?我的观点是因为我们经常到了必须在strings 和vectors 字符之间进行选择的地步。程序实际处理或处理的第一个示例是否与其他示例不同?


如何删除一个树节点然后选择另一个以保持对树的关注?

当然,我在这里忽略了一些如此明显和简单的东西,但我就是看不到它。

我有一个树视图,节点在运行时添加到它,也可以删除。当我删除一个节点时,树中不再有一个选定的节点,HideSelection 也设置为 False 但这不会有任何区别,因为选定的节点被删除,我猜是标准行为。

无论如何,为了减少需要重新关注树视图的次数和输入,我想在删除一个节点后自动重新选择树中的一个节点(如果连续快速删除大量节点特别有用,因为它消除了单击的需要回到树视图)。

所以假设我有一棵这样的树:

在此处输入图像描述

这是我正在寻找的行为模式,以以下场景为例:

  • Item1可以选择,当删除Root成为选择。
  • Item2可以选择,当删除Item6成为选择。
  • Item3可以选择,当删除Item4成为选择。
  • Item4可以选择,当删除Item5成为选择。
  • Item5可以选择,当删除Item4成为选择。
  • Item5可以选择,如果Item4不存在则删除,Item3则应选择。
  • Item5可以选择,当删除时,如果Item3Item4不存在,选择Item2.
  • Item6可以选择,当删除Item2成为选择。
  • Item7可以选择,当删除Item6成为选择。

我不断让索引越界和其他 AV 错误(在 Lazarus 中),这甚至没有达到检查当前选定节点在树中的位置的地步。

就目前而言,在我的删除事件中,我有这个:

procedure TMainForm.actDeleteExecute(Sender: TObject);
var  
  SelNode: TTreeNode;
begin
  if TreeView1.Selected <> nil then
  begin
    SelNode := TreeView1.Selected;

    TreeView1.Selected.Delete;
    TreeView1.SetFocus;
    //ShowMessage(SelNode.GetPrev.Text);  
    TreeView1.Selected.Index := SelNode.Index; 
  end;
end;

这是我再次完全误解情况并使任务变得不必要的困难的情况,还是实施这种行为涉及大量工作?

提前谢谢了。

4

3 回答 3

6

我的观点是因为我们经常到了必须在字符串和字符向量之间进行选择的地步。

常常?我不这么认为。

如果某些东西基本上是一个字符串,只需使用std::string.

如果并且当您可以证明性能不是最理想的(通常通过在真实数据上分析您的程序)时,请考虑替代方案。std::vector<char>是这样一种选择,但还有其他选择。如果有的话,哪个更可取取决于实际用例。

在您遇到令人信服的真实案例std::string替换std::vector<char>.

于 2013-09-15T18:30:36.473 回答
1

使用有一个明显的优势

out << str;

在循环中逐个写入字符:格式化的输出运算符,包括那些为每个输出char创建一个对象的运算符。std::ostream::sentry此外,由于流不知道您刚刚在流中写入了一个字符,因此它需要重新检查其内部状态。如果您想与上述格式的输出相比,分析字符的书写序列,您应该使用类似的东西

out.write(str.c_str(), str.size());

或者

std::copy(str.begin(), str.end(), std::ostreambuf_iterator<char>(out));

我希望格式化的输出和使用的版本write()具有大致相同的性能,并且使用的版本std::copy()可能更慢,尽管没有充分的理由认为它必须比标准 C++ 库更慢而不是创建快速实现:我知道它可以有效地完成主要是因为我为我的实验性标准 C++ 库实现做了它。

于 2013-09-15T19:02:08.053 回答
1

在所有三种情况下都有一个循环 - 在第一种情况下,它在operator <<调用执行循环的操作系统的实现内部,而在其他两种情况下,它在您的代码中。

最后两种情况在性能方面是相同的,如果不是在生成的代码方面:字符串和向量都使用连续存储,因此它们operator []的 s 非常快。

第一种情况,循环属于运算符的实现,当实现调用底层操作系统时,可能会得到更好的优化。然而,最重要的一点是可读性:带有简单语句的单行总是比简单的循环更好。

一般来说,字符串和chars 的向量之间最大的区别在于两个容器支持的原语集:字符串旨在传达类似字符串的语义(制作子字符串,简单搜索),而向量更好地传达类似数组的语义(可快速访问任意索引的项目的顺序集合)。在性能方面,这两种结构非常相似。

于 2013-09-15T18:35:41.287 回答