在clang中,有没有办法启用边界检查[]访问std :: vectors和其他STL容器,最好只在调试模式下构建?
我花了好几个小时寻找一个微妙的错误,结果是我们访问了std :: vector的末尾.当它检测到错误时,它不需要做任何聪明的事情,只需在调试器中陷阱,以便我可以找到它发生的位置并在代码中修复它.
除了"创建继承自std :: vector的自己的类型"之外,有没有办法做到这一点,我想避免哪些?
(如果这有所不同,我正在使用clang 3.1版.)
如果我从一个API获得NSData*并且需要将其转换为另一个API的std :: vector,那么有没有办法安全地执行此操作而不复制NSData中的字节(假设一个非常大的NSData*)?
我有一个C没有定义的类operator=.我试图使用这样的矢量:std::vector<std::pair<C,D>> vec;.现在,我的问题是,在我完成它之后,我无法擦掉它.编译器会抱怨缺少operator=的C.我可以没有没有此运算符的类的向量吗?我该如何解决这个问题?我无法添加作业C.这是我得到的错误:
error C2582: 'operator =' function is unavailable in 'C' C:\...\include\utility 196 1 my-lib
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
void Remove(const C& c)
{
auto i = cs_.begin();
while( i != cs_.end()) {
if (i->first == c) {
cs_.erase(i); // this is the problem
break;
}
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
在哪里cs_:
std::vector<std::pair<C,D>> cs_;
Run Code Online (Sandbox Code Playgroud) 似乎每一次你添加一个新的元素到std::vector,如果没有空元素,分配元素的数量加倍(至少在GCC 4.9).我认为这样做是为了实现摊销的恒定时间复杂度.
例如,运行此代码后:
v.push_back (1);
v.push_back (2);
v.push_back (3);
v.push_back (4);
v.push_back (5);
v.shrink_to_fit(); // capacity is 5 now
v.push_back (6);
std::cout << v.capacity () << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出为10.
在内存受限系统中,有没有办法防止这种行为,即使它是以性能损失为代价的?
此外,是否可以指出它应该只分配固定数量的元素而不是加倍?
我知道我可以std::vector::reserve()在添加新元素之前调用,但在我的情况下看起来一团糟......调用std::vector::shrink_to_fit()是另一种方法,但也不方便.
这个C++ 11代码对我来说很好:
#include <iostream>
#include <vector>
#include <array>
using namespace std;
struct str {
int first, last;
};
vector<str> fields {
{1,2}, {3,4}, {5,6}
};
int main()
{
for (str s : fields)
cout << s.first << " " << s.last << endl;
}
Run Code Online (Sandbox Code Playgroud)
它打印出六个预期值.
但是,如果我vector<str>改为array<str,3>,gcc会给我这个错误:"std :: array'的初始化程序太多了".
如果我改变了初始化fields:
array<str,3> fields {
str{1,2}, str{3,4}, str{5,6}
};
Run Code Online (Sandbox Code Playgroud)
事情很顺利.
那么为什么我str{1,2}在使用时需要std::array,但仅{1,2}在使用时std::vector?
我目前处于一种情况,我想复制一个向量中的一些元素.简而言之,我的代码类似于以下内容:
std::vector<MyStruct> v;
// ...
auto toDuplicate = std::find(v.begin(), v.end(), [](const MyStruct &s) { return true; /*In reality, a bit more complex*/ });
v.insert(toDuplicate, nrOfDuplicates-1, *toDuplicate);
// Signature: insert(iterator, size_t, const value_type &)
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,如果容量小于最终容量,则std :: vector必须重新分配其内部数据,使得我的引用插入的数据无效.
我正在使用的STL(MSVC2013)的实现包含对这种插入的保护,因为如果需要重新分配它将执行我的元素的副本.但是,我不确定我是否能够依赖这种行为,还是需要我自己先复制一份?(当我升级到新的STL实现时,我宁愿防止自己看到这种错误)
所以简而言之:我是否允许在向量上调用insert()并引用同一向量中的元素?
我想在另一个向量的末尾追加一个向量.据我所知,该功能std::move()是此任务的"选择功能".为什么std::move()在手工制作的循环按预期工作时,Microsoft Visual C++ Express会崩溃?
我使用的是Microsoft Visual C++ 2015 Update 3.不幸的是,我无法使用其他编译器对此进行测试.
// The setup code for the two vectors:
vector<unique_ptr<channel>> channels, added_channels;
// ... here is some code that adds some elements to both vectors
Run Code Online (Sandbox Code Playgroud)
根据我的知识,以下两段代码应该以相同的方式工作.他们应该把元素added_channels移到最后channels.
这是第一个崩溃的变种:
std::move(added_channels.begin(), added_channels.end(), channels.end());
Run Code Online (Sandbox Code Playgroud)
这是第二个有效的版本:
for(auto & ref : added_channels)
{
channels.push_back(std::move(ref));
}
Run Code Online (Sandbox Code Playgroud) 我刚开始学习C++,我正在尝试如何std::vector工作.
我有这个测试程序:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> element1 = { 1, 2,3 };
std::vector<int> element2 = { 4, 5, 6 };
std::vector<std::vector<int>> lista = { element1, element2 };
std::vector<int> var = lista.at(0);
for (std::vector<int>::const_iterator i = var.begin(); i != var.end(); ++i)
std::cout << *i << ' ';
std::cout << std::endl;
var[0] = 22;
for (std::vector<int>::const_iterator i = var.begin(); i != var.end(); ++i)
std::cout << *i << ' ';
std::cout << std::endl;
for (std::vector<int>::const_iterator i = …Run Code Online (Sandbox Code Playgroud) 假设我想从中删除唯一元素std::vector(不消除重复项,而仅保留至少出现2次的元素),并且我想以一种非常低效的方式实现这一点-通过std::count在std::remove_ifing时调用。考虑以下代码:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 6, 3, 6, 2, 7, 4, 4, 5, 6};
auto to_remove = std::remove_if(vec.begin(), vec.end(), [&vec](int n) {
return std::count(vec.begin(), vec.end(), n) == 1;
});
vec.erase(to_remove, vec.end());
for (int i : vec) std::cout << i << ' ';
}
Run Code Online (Sandbox Code Playgroud)
从参考开始,std::remove_if我们知道从开始的元素to_remove具有未指定的值,但是我想知道它们到底有多未指定。
为了解释我所关心的远一点-我们可以看到,应删除的元素是1,3,5和7-唯一的唯一值。std::remove_if会将移至 …