容器需求已从C++ 03更改为C++ 11.虽然C++ 03有一揽子要求(例如复制构造性和向量的可赋值性),但C++ 11定义了每个容器操作的细粒度要求(第23.2节).
因此,只要您只执行某些不需要赋值的操作(构造并且push_back是这样的操作),您可以例如在向量中存储可复制构造但不可赋值的类型(例如具有const成员的结构).; insert不是).
我想知道的是:这是否意味着标准现在允许vector<const T>?我没有看到任何理由它不应该 - const T就像具有const成员的结构一样,是一种可复制构造但不可分配的类型 - 但我可能错过了一些东西.
(让我觉得我可能错过了一些东西的部分原因是,如果你试图实例化vector<const T>,那gcc trunk会崩溃并烧掉,但是vector<T>对于T有const成员的地方来说很好).
我对这个答案的评论让我思考了constness和sort的问题.我玩了一下,把我的问题减少到这个代码的事实:
#include <vector>
int main() {
std::vector <const int> v;
}
Run Code Online (Sandbox Code Playgroud)
不会编译 - 你不能创建const int的向量.显然,我应该知道这一点(而且我已经知道了),但我以前从未需要创造这样的东西.然而,它似乎对我来说是一个有用的构造,我想知道是否有任何解决这个问题的方法 - 我想将东西添加到向量(或其他),但是一旦添加它们就不应该被更改.
可能有一些令人尴尬的简单解决方案,但这是我以前从未考虑过的.我可能不应该提到排序(我可能会问另一个问题,看看这个问题的难度).我真正的基本用例是这样的:
vector <const int> v; // ok (i.e. I want it to be OK)
v.push_back( 42 ); // ok
int n = v[0]; // ok
v[0] = 1; // not allowed
Run Code Online (Sandbox Code Playgroud) 另一个问题的答案
解释了为什么我们(据说)不能拥有const对象的容器.例如,这是不允许的:
vector<const int> v; //not allowed
Run Code Online (Sandbox Code Playgroud)
但为什么pair允许第一个对象const呢?实际上,这是对象pair内部的s 所发生的事情map.我错过了什么吗?
将非常感谢对这种现象的详细和直观的解释.
由于STL容器要求所有内容都是可复制和可分配的,因此在处理不可复制对象时,首选的习惯是什么?
我可以想到两种不同的方法:
存储(智能)指针而不是STL容器中的对象.
摆脱STL容器并实现我自己的列表(例如,每个对象必须包含指向下一个对象的指针).
第二种方法的主要缺点是析构函数的实现("下一个"对象应该以递归方式在当前对象之前销毁吗?)
有人告诉我,vector.reserve()在插入大量元素之前调用是个好习惯.我刚刚遇到一种情况,我想将大量const元素放入其中vector.reserve()但是,在调用时,会抛出编译器错误.
请考虑以下代码重现问题:
#include <vector>
int main()
{
std::vector<const int> vec;
vec.reserve(2);
}
Run Code Online (Sandbox Code Playgroud)
这会导致以下巨大的编译器错误:
In file included from /usr/include/x86_64-linux-gnu/c++/4.8/bits/c++allocator.h:33:0,
from /usr/include/c++/4.8/bits/allocator.h:46,
from /usr/include/c++/4.8/vector:61,
from vecreserve.cpp:1:
/usr/include/c++/4.8/ext/new_allocator.h: In instantiation of ‘struct __gnu_cxx::new_allocator’:
/usr/include/c++/4.8/bits/allocator.h:92:11: required from ‘class std::allocator’
/usr/include/c++/4.8/bits/alloc_traits.h:90:43: required from ‘struct std::allocator_traits >’
/usr/include/c++/4.8/ext/alloc_traits.h:121:10: required from ‘struct __gnu_cxx::__alloc_traits >’
/usr/include/c++/4.8/bits/stl_vector.h:75:28: required from ‘struct std::_Vector_base >’
/usr/include/c++/4.8/bits/stl_vector.h:210:11: required from ‘class std::vector’
vecreserve.cpp:5:26: required from here
/usr/include/c++/4.8/ext/new_allocator.h:93:7: error: ‘const _Tp* __gnu_cxx::new_allocator::address(__gnu_cxx::new_allocator::const_reference) const [with _Tp = const …