我正在编写字符串排序,我无法决定是否应该使用数组或向量,以便我在算法中使用的交换操作更快。 假设我有一个这样的矢量和数组。
vector<string> vec;
string str[20];
以下哪一项交换操作会更快,或者它们是等效的?
vector[i].swap(vector[j]);
str[i].swap(str[j]);
答案 0 :(得分:4)
它们是等价的。事实上,它们不仅相同,而且相同,因为在每种情况下,您都在调用完全相同的函数:
basic_string::swap()
但是,对于更大的问题 - 你应该使用数组还是应该使用vector
。作为一般的经验法则,我认为我很难找到许多合法的例外 - 你应该在C ++中默认使用vector
,除非你有特殊的理由不这样做。除极少数情况外,速度不会是其中一个原因。
答案 1 :(得分:1)
交换操作应该或多或少地具有相同的速度,可能数组的速度可以忽略不计,但不是交换操作本身,而是通过vector
访问元素的方式。
您应该在这里寻找与性能无关的标准。
答案 2 :(得分:0)
访问数组中的元素会有更好的局部性,因为在访问数组中的元素时,您将偏移量应用于第一个元素的地址。在向量中访问元素时,您将应用两个偏移量 - 一个用于获取存储在向量类中的数组的指针,然后是另一个偏移量以获取该数组中的元素。但这根本不重要,编译器可能(甚至应该)优化这种不同的东西。
理论上可能会减慢你的速度是一个字符串比较,并访问这些字符串的内容。你看,std::string
在堆上分配它的数据,如果你运气不好,每个字符串的数据将指向彼此相距太远的内存位置。鉴于字符串的内容不适合L1缓存和内存位置的随机性,预取器将无法使代码可用数据,并且CPU只会等待内存总线卡住。
我从更高级别的优化开始。首先,运行一个分析器,看看你的程序究竟是什么瓶颈。如果结果是排序,我会看是否可以使用不同的排序算法(即部分排序而不是完整排序)。然后尝试优化内存访问。然后才考虑是否应该使用std :: vector。你在这里做什么我认为是一个不成熟的优化,这是不好的。