【问题标题】:What would be a good replacement for C++ vector in C#?什么是 C# 中 C++ 向量的良好替代品?
【发布时间】:2012-05-25 21:27:22
【问题描述】:

我正在努力提高我在其他语言方面的技能,因为我使用 c++ 作为我的主要编程语言。我目前的项目正在敲定 C#.net,因为我听说它对于同时了解 c++ 和 VB.net 的人来说是一种很好的中间语言。

通常,当在 c++ 中处理未知数量的元素时,我会将变量声明为向量,然后从那里开始。 c# 中似乎不存在向量,而在我当前的程序中,我一直在使用 arraylists,但我开始怀疑使用 arraylists 是否是一个好习惯,因为我在某处读到它是 .net 1.0 的遗留物

很长的问题简短——c# 最常用的列表类型是什么?

【问题讨论】:

  • 这个问题的答案将适用于任何 .NET 语言(包括 C++/CLI 和 F#),.NET 中每种语言的数据类型相对较少。

标签: c# .net c++


【解决方案1】:

如果您的目标是 .NET 2.0 之前的版本,请使用 ArrayList

如果您的目标是 .NET 2.0+,则使用泛型类型 List<T>

您可能需要寻找其他 C++ 标准容器的替代品,因此这里有可能将 C++ 映射到 .NET 2.0+ 类似类型或等价物:

std::vector - List<T>
std::list - LinkedList<T>
std::map - Dictionary<K, V>
std::set - HashSet<T>
std::multimap - Dictionary<K, List<V>>

【讨论】:

  • 我认为std::set 会更接近于HashSet&lt;T&gt;
  • List&lt;T&gt;在C#中的表现如何?和 C++ 中的std::vector 一样好吗?!
  • @Babak 严格面向对象的编程语言不能让容器以与 C++ 中相同的方式执行。 C++ 在连续的内存块中分配一个向量(结构或类的向量被分配到一个连续的内存块中),而严格的 OO 编程语言分配一个连续的指针内存块,这些指针指向内存中随机分配的数据。这对缓存非常不利。虽然 C++ 中的向量对缓存非常友好,并且有助于大大加速任何操作(甚至插入),但在严格的 OO 中,传递向量会导致很多缓存未命中......
【解决方案2】:

我建议您探索 System.Collections 命名空间,尤其是 System.Collections.Generics 对象集。内置功能可以在各种列表、字典和 NameValueCollections 中进行强类型化,从而为您提供广泛的功能。它们也是可扩展的,因此如果它们不能完全满足您的需求,您只需扩展它们并添加新功能即可。

【讨论】:

    【解决方案3】:

    我想应该是List&lt;T&gt;ArrayList 是非泛型类型,并且 - 正如您正确观察到的那样 - 是 .NET 1 次的剩余部分。从 .NET 2 开始,您可以使用泛型,因此可以使用 List&lt;T&gt;

    【讨论】:

      【解决方案4】:

      简答:List&lt;T&gt;。你可以找到文档here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-15
        相关资源
        最近更新 更多