首页 > 试题广场 >

以下关于STL的描述中,____是错的。

[单选题]
以下关于STL的描述中,____是错的。
  • STL容器是线程不安全的
  • 当容量不够时,STL的一个典型实现是vector内部内存扩展方式为翻倍
  • std::sort是稳定排序
  • std::bitset不是一个STL容器
  • std::stack默认是用deque实现的
  • std::string中可以存储多个’\0’字符
推荐
选择:C
A:“很多程序员希望STL实现是完全线程安全的“。所以不安全。
B:vector的存在可以使开发者不必关心内存的申请和释放。但是,vector的一个缺点就是它的内存分配是按照2的倍数分配内存的。
C:错误。要知道 std::sort 不是稳定的排序算法,它不保证“相等”元素的相对位置,使用 std::stable_sort 来保证这一点
D:STL的容器可以分为以下几个大类: 
一:序列容器, 有vector, list, deque, string.
二 : 关联容器,     有set, multiset, map, mulmap, hash_set, hash_map, hash_multiset, hash_multimap
三: 其他的杂项: stack, queue, valarray, bitset
E:正确。堆栈是一个线性表,插入删除操作都在一端进行,deque是先进先出的,操作原理和stack是一样的
编辑于 2015-07-16 21:02:21 回复(14)
为什么不选F,string中是如何存储多个’\0’字符的?
发表于 2015-11-27 09:46:52 回复(6)
c啊
发表于 2015-04-25 16:59:15 回复(0)
答案有误吧,应该是C,不然区分std::sort和std::stable_sort就没意义了。
关于容器的定义和列表参见https://msdn.microsoft.com/zh-cn/library/1fe2x6kt.aspx,明显bitset不在列,它是非标准容器。
发表于 2015-04-14 19:37:55 回复(1)
C 是错误的,std::sort封装了快速排序算法,因此是不稳定的,如果要使用稳定排序,可以用std:stable_sort
发表于 2015-04-10 09:16:57 回复(0)
强烈反对楼上各位的答案
解释一下B和C
首先C++标准并没有规定vector的增长方式,题目说vector内部内存扩展方式是翻倍其实严格来说是错的,只是现代大多数编译器这么决定罢了,并不是说标准规定了,这个编译器想怎么干事编译器的事,比如说MS的Visual studio就不是这么干的,不多说,直接看代码。
#include <iostream>
#include <vector>

int main()
{
	std::vector<int>::size_type sz;

	std::vector<int> foo;
	sz = foo.capacity();
	std::cout << "making foo grow:\n";
	for (int i = 0; i<100; ++i) {
		foo.push_back(i);
		if (sz != foo.capacity()) {
			sz = foo.capacity();
			std::cout << "capacity changed: " << sz << '\n';
		}
	}

	std::vector<int> bar;
	sz = bar.capacity();
	bar.reserve(100);   // this is the only difference with foo above
	std::cout << "making bar grow:\n";
	for (int i = 0; i<100; ++i) {
		bar.push_back(i);
		if (sz != bar.capacity()) {
			sz = bar.capacity();
			std::cout << "capacity changed: " << sz << '\n';
		}
	}
	return 0;
}

C选项sort并不是简单的封装快排而已,sort会根据数据的具体情况进行具体的优化,使用不确定的排序,而不是快排。
发表于 2016-02-06 16:34:44 回复(2)
与std::sort相关的内容可以参考这里:http://www.360doc.com/content/13/0203/15/7802291_264024899.shtml
其中说明了它是一个不稳定的排序。
发表于 2016-03-13 11:23:54 回复(0)
B也有问题呀,根据编译器不同,增长方式也不一样,vs是加上上一个的一半,vc是成倍翻转
发表于 2017-07-13 14:01:35 回复(0)
std::bitset 是标准库提供的bitset类,用于处理二进制位的有序集,不属于容器
发表于 2017-06-26 17:06:45 回复(0)
原题是这样的
发表于 2015-04-15 10:13:05 回复(1)
这个题答案不正确。事实上,上面很多同学都提到了vector的增长方式并没有规定在空间不足时成倍增长,这个依赖于编译器的实现,比如windows中stl的vector是1.5倍增长的,sgi的是2倍增长。

编辑于 2020-04-25 11:47:16 回复(0)
std::sort
数据过多时:快速排序
中等数据量:堆排序
数据量少:插入排序
发表于 2018-08-22 17:40:50 回复(0)
选项F:编译试一下,的确可以存储多个’\0’字符
#include<iostream> #include<string> using namespace std; int main() { string a = "123456"; for (int i = 0; i < a.length()-2; i++) { if (a[i] != '\0') { a[i] = '\0'; } } cout << a << endl; return 0; }
发表于 2017-08-25 17:31:32 回复(0)
std::sort不是稳定排序算法,应该选C,为什么答案是选D呢?
bitset不能称之为一个容器,因为并没有包含其他对象。
发表于 2015-04-10 22:47:13 回复(3)
B:需要根据编译器确定
C:sort中不是单独一种排序算法,根据数据量的大小,迭代次数,数据量大时用快排进行分段的递归,若递归中数量小了,改用插入排序,若递归层次过深,用堆排序
D:一:序列容器, 有vector, list, deque, string.
二 : 关联容器,     有set, multiset, map, mulmap, hash_set, hash_map, hash_multiset, hash_multimap

发表于 2018-08-06 11:13:08 回复(0)
bitset 是一个模板,但其类型是一个正整数,用法如: 
bitset<3> bb;
bb[0] = 1;
bb[1] = false;
bb[2] = 0;

发表于 2019-01-02 19:42:06 回复(0)
Stack和queue 都是用dequeue 实现的
发表于 2018-06-25 11:48:36 回复(1)
vector空间不是翻倍的,
发表于 2018-01-01 00:46:21 回复(0)
std::string s("a\0b\0c\0d");这样是可以存的,但用cout只能输出a,要用for循环才能输出全部字符串。
发表于 2017-08-29 09:01:00 回复(0)
string中可以存放多个`\0`吗,F也不对吧
发表于 2017-03-10 08:57:59 回复(1)
F为什么可以存储多个'/0'啊
发表于 2016-12-22 07:55:33 回复(0)