相关疑难解决方法(0)

C++ 11是否允许vector <const T>?

容器需求已从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成员的地方来说很好).

c++ const vector c++11

65
推荐指数
4
解决办法
1万
查看次数

我可以在向量中使用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)

c++ stl const

60
推荐指数
4
解决办法
4375
查看次数

不允许使用vector <const int>.为什么允许pair <const int,int>?

可能重复:
为什么stack <const string>不能用g ++编译?

另一个问题的答案 解释了为什么我们(据说)不能拥有const对象的容器.例如,这是不允许的:

vector<const int> v; //not allowed
Run Code Online (Sandbox Code Playgroud)

但为什么pair允许第一个对象const呢?实际上,这是对象pair内部的s 所发生的事情map.我错过了什么吗?

将非常感谢对这种现象的详细和直观的解释.

c++

5
推荐指数
2
解决办法
4083
查看次数

STL容器和不可复制(和不可移动)的对象

由于STL容器要求所有内容都是可复制和可分配的,因此在处理不可复制对象时,首选的习惯是什么?

我可以想到两种不同的方法:

  1. 存储(智能)指针而不是STL容器中的对象.

  2. 摆脱STL容器并实现我自己的列表(例如,每个对象必须包含指向下一个对象的指针).

第二种方法的主要缺点是析构函数的实现("下一个"对象应该以递归方式在当前对象之前销毁吗?)

c++ stl

5
推荐指数
2
解决办法
2086
查看次数

为什么我不能在const元素的向量上调用reserve?

有人告诉我,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 …

c++ vector

4
推荐指数
1
解决办法
4798
查看次数

标签 统计

c++ ×5

const ×2

stl ×2

vector ×2

c++11 ×1