vector<int> v;
v.push_back(1);
v.push_back(v[0]);
Run Code Online (Sandbox Code Playgroud)
如果第二个push_back导致重新分配,则向量中对第一个整数的引用将不再有效.那么这不安全吗?
vector<int> v;
v.push_back(1);
v.reserve(v.size() + 1);
v.push_back(v[0]);
Run Code Online (Sandbox Code Playgroud)
这样可以安全吗?
我正在使用Visual Studio 2013 Preview,虽然我确信我已经在早期版本中看到过它.使用向导创建新项目时,我选择C++,Win32控制台应用程序,并且有一个选项可以在我的项目上启用安全开发生命周期检查.有人可以解释这个选项对我的代码/项目的确切作用吗?
本网站暗示清除向量可能会改变容量:
http://en.cppreference.com/w/cpp/container/vector/clear
许多实现在调用clear()之后不会释放已分配的内存,从而有效地保持向量的容量()不变.
但根据@JamesKanze的说法,这是错误的,标准要求明确不会改变容量.
标准说什么?
我怎样才能a3
编译?
int main()
{
int a1[] = { 1, 2, 3 };
std::array<int, 3> a2 = { 1, 2, 3 };
std::array<int> a3 = { 1, 2, 3 };
}
Run Code Online (Sandbox Code Playgroud)
使用初始化列表时,对数组的大小进行硬编码是非常不方便的,也是很脆弱的,特别是长的列表.有什么工作吗?我希望如此,否则我很失望,因为我讨厌C阵列,std::array
应该是他们的替代品.
假设我有一些遗留代码,除非发现错误,否则无法更改,并且它包含以下代码:
bool data[32];
memset(data, 0, sizeof(data));
Run Code Online (Sandbox Code Playgroud)
这是bool
将数组中的所有false
值设置为值的安全方法吗?
更一般地,是安全的memset
一bool
对0
,以使其价值false
?
是否保证可以在所有编译器上运行?或者我是否要求修复?
这里列出了std::abs
C++ 中的当前重载.我想知道为什么不定义以下模板并放弃所有丑陋的C风格重载?
template <typename T> inline
T abs(const T& v) { return v < 0 ? -v : v; }
Run Code Online (Sandbox Code Playgroud) std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };
Run Code Online (Sandbox Code Playgroud)
VS2013错误:
错误C2440:'初始化':无法从'int'转换为'std :: pair'没有构造函数可以采用源类型,或构造函数重载解析是不明确的
我究竟做错了什么?
具体来说,我有一个目前使用vector和push_back的类.我想跟踪的向量中有一个元素.推回向量可能会使迭代器无效,所以我保持其索引.使用索引再次找到迭代器很便宜.我不能保留矢量,因为我不知道将插入多少项.
我已经考虑过将数据结构作为模板参数,也许可以使用list.在这种情况下,从索引中查找迭代器不是一个简单的操作.由于推回列表不会使现有元素的迭代器无效,我可以只存储这个迭代器.
但是,我如何编写一个容易处理这两种情况的泛型类?
如果我可以找出push_back是否会使迭代器无效,我可以存储迭代器并在每次push_back之后通过存储操作之前的距离来更新它.
我知道如何从向量迭代器中获取索引,方法是从中减去begin迭代器.例如:
vector<int>::iterator it = find(vec.begin(), vec.end(), x);
size_t position = it - vec.begin();
Run Code Online (Sandbox Code Playgroud)
但是,现在我想找到x
向量中最后一个的索引.如何从反向迭代器中获取实际索引?我发现以下似乎有效(编辑:它没有)但也许有更好的(更惯用或其他......)方式.
vector<int>::reverse_iterator it = find(vec.rbegin(), vec.rend(), x);
size_t position = vec.size() - (it - vec.rbegin());
Run Code Online (Sandbox Code Playgroud) 是否有任何(有用的?)区别:
auto test = [..](..){..};
Run Code Online (Sandbox Code Playgroud)
和
const auto test = [..](..){..};
Run Code Online (Sandbox Code Playgroud)
?