C++中的std::vector和数组在现实世界中的应用

11 浏览
0 Comments

C++中的std::vector和数组在现实世界中的应用

我是C++的新手。我在读Michael Dawson的《通过游戏编程初学C++》。但是,我对编程并不陌生。我刚刚完成了一个关于向量的章节,所以我有一个关于在现实世界中使用它们的问题(我是计算机科学专业的学生,所以我在现实世界中的经验还不多)。\n作者在每章的最后都有一个问答环节,其中一个问题是:\n

\n问:什么时候应该使用向量而不是数组?\n答:几乎总是。向量高效且灵活。它们确实需要比数组更多的内存,但这种权衡几乎总是值得的。\n

\n你们觉得呢?我记得在一本Java书中学过向量,但是在我的计算机科学入门课程和数据结构课程中,我们根本没有涉及它们。我在任何编程作业中也没有见过它们的使用(包括Java和C语言)。这让我觉得它们并不经常使用,尽管我知道学校代码和现实世界的代码可能差别很大。\n我不需要听关于这两种数据结构的区别,我非常清楚。我只想知道作者在他的问答中给出的建议是否正确,或者他只是试图让初学者避免处理固定大小数据结构的复杂性。另外,不论你对作者的建议有何看法,你在现实世界中更常见到什么?

0
0 Comments

在现实世界中,我经常看到很多数组。但我也看到很多使用“类C语言”风格的C++编程的遗留代码库。这并不意味着你应该以这种方式编程。

然而,由于历史原因或其他因素,一些项目仍然使用数组来管理数据。这可能导致一些问题和挑战,例如数组大小固定、不易扩展、难以插入或删除元素等。为了解决这些问题,可以考虑使用C++标准库中的std::vector。

std::vector是一个动态数组,它可以自动调整大小以容纳不断变化的数据。它提供了许多方便的方法和功能,使其在实际应用中非常有用。与普通数组相比,std::vector具有许多优势。

首先,std::vector可以自动调整大小。这意味着您可以随时向其中添加或删除元素,而无需手动管理数组大小。这使得代码更加简洁和可读,同时也减少了出错的可能性。

其次,std::vector提供了许多有用的成员函数和操作符重载,例如push_back()、pop_back()、insert()等。这些函数使得在向std::vector中添加、删除或访问元素时变得非常简单和方便。

此外,std::vector还提供了一些与数组相关的功能,例如访问元素的方法、获取数组大小的方法等。这使得您可以像使用普通数组一样使用std::vector,同时还能享受到其提供的其他优势。

std::vector是一个强大而方便的数据结构,可以在许多实际应用中替代普通数组。它解决了数组大小固定、难以扩展和插入/删除元素等问题,并提供了许多有用的功能和方法。

如果您正在处理一个使用数组的遗留代码库,考虑将其替换为std::vector。这将使您的代码更加现代化、可读性更强,并且更容易维护和拓展。

下面是一个简单的示例,展示了如何使用std::vector替代普通数组:

#include 
#include 
int main() {
    std::vector myVector;
    myVector.push_back(1);
    myVector.push_back(2);
    myVector.push_back(3);
    for (int i = 0; i < myVector.size(); i++) {
        std::cout << myVector[i] << " ";
    }
    return 0;
}

这段代码创建了一个std::vector,并向其中添加了三个元素。然后,使用for循环遍历并打印出每个元素的值。这展示了如何使用std::vector的push_back()函数向其中添加元素,并使用方括号运算符[]访问元素。

通过使用std::vector,您可以更好地管理和操作数组,使代码更加简洁、可读性更强,并且更易于维护和拓展。

0
0 Comments

在现实世界中,使用vector而不是数组的一个最好的原因是RAII习语。基本上,为了使C++代码具有异常安全性,任何动态分配的内存或其他资源都应该封装在对象中。这些对象应该有释放这些资源的析构函数。

当异常未被处理时,唯一保证会被调用的是堆栈上对象的析构函数。如果在对象外动态分配内存,并且在其被删除之前的某个地方抛出了未捕获的异常,就会导致内存泄漏。

这也是一种避免记住使用delete的好方法。

您还应该查看std::algorithm,它为vector和其他STL容器提供了许多常见算法。

我曾经在一些情况下使用vector编写代码,事后看来,也许使用本机数组会更好。但在所有这些情况下,Boost::multi_arrayBlitz::Array都会比它们更好。

int a[5];是完全异常安全的。你确定OP在谈论的是动态分配的数组吗?

我选择了灵活,在C代码中,通常在方法的开头分配固定长度的缓冲区。不过,我确实认为std::vector(或std::string)是更好的选择 🙂

0
0 Comments

C++中的std::vector和数组之间的比较是一个常见的问题。一般来说,使用vector比数组更高效和灵活。尽管vector需要比数组更多的内存,但这种权衡几乎总是值得的。然而,有一些情况下使用数组是有吸引力的:

1. 当元素在编译时就已经确定时,使用数组会更方便。在C++11中,使用std::vector初始化值的方式与数组一样简洁。

2. 当元素的数量固定时,使用数组也是合适的。例如,使用数组来存储布尔值的字符串表示,或者使用数组来表示国际象棋的棋盘。

3. 当首次使用性能至关重要时,数组的性能优势更明显。编译器可以将完全预初始化的对象的内存快照直接写入可执行映像,然后在使用时直接将其调入内存,因此通常比运行时堆分配(new[])和对象的串行构造要快得多。此外,编译器生成的const数据表可以被多个线程安全地读取,而运行时构造的数据必须在非函数本地静态变量的构造函数触发的其他代码使用该数据之前完成构造。

4. C++的一个强大特性是,通常可以编写一个类(或结构体),该类完全模拟了特定协议所需的内存布局,然后将类指针指向需要处理的内存,以便方便地解释或赋值。这种情况下,使用数组来嵌入小型固定大小的数组是非常常见的。

5. 数组可以以一种古老的方式嵌入在结构体/类的末尾,通过在更大的数据区域上使用该结构类型的指针,并根据对内存可用性和内容的先前了解,在结构的末尾访问数组元素。这种方法在一些特定的场景中非常有用。

6. 嵌入数组可以将内存访问要求局部化,提高缓存命中率,从而提高性能。

然而,如果使用vector不会带来额外的麻烦(如代码简洁性、可读性或性能),那么最好还是使用vector。vector提供了很多方便的功能,例如size()、at()进行检查的随机访问、迭代器、调整大小等。此外,如果需要,从vector切换到其他标准容器通常更容易,并且使用标准算法更安全、更容易。

值得注意的是,在C++11中引入了std::array,它避免了vector的一些开销,内部使用固定大小的数组,避免了额外的堆内存分配/释放,并提供了一些类似vector的功能和API特性。

0