标签: stdvector

7
推荐指数
4
解决办法
7369
查看次数

在clang中检查std :: vector(和其他容器)的边界?

在clang中,有没有办法启用边界检查[]访问std :: vectors和其他STL容器,最好只在调试模式下构建?

我花了好几个小时寻找一个微妙的错误,结果是我们访问了std :: vector的末尾.当它检测到错误时,它不需要做任何聪明的事情,只需在调试器中陷阱,以便我可以找到它发生的位置并在代码中修复它.

除了"创建继承自std :: vector的自己的类型"之外,有没有办法做到这一点,我想避免哪些?

(如果这有所不同,我正在使用clang 3.1版.)

clang stdvector

7
推荐指数
1
解决办法
1861
查看次数

NSData*到std :: vector <unsigned char>没有Copy

如果我从一个API获得NSData*并且需要将其转换为另一个API的std :: vector,那么有没有办法安全地执行此操作而不复制NSData中的字节(假设一个非常大的NSData*)?

objective-c stdvector nsdata

7
推荐指数
1
解决办法
2984
查看次数

std :: vector :: erase(item)是否需要为item定义赋值运算符?

我有一个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)

c++ operators stdvector visual-studio-2012

7
推荐指数
1
解决办法
1570
查看次数

std :: vector和内存分配

似乎每一次你添加一个新的元素到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++ stdvector

7
推荐指数
1
解决办法
235
查看次数

std :: vector和std :: array初始化列表之间的区别

这个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?

c++ arrays stdvector initializer-list c++11

7
推荐指数
1
解决办法
705
查看次数

参考同一向量的数据插入向量

我目前处于一种情况,我想复制一个向量中的一些元素.简而言之,我的代码类似于以下内容:

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()并引用同一向量中的元素?

c++ stl vector stdvector

7
推荐指数
1
解决办法
128
查看次数

visual c ++为什么std :: move崩溃

我想在另一个向量的末尾追加一个向量.据我所知,该功能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++ stdvector visual-c++ c++11

7
推荐指数
2
解决办法
485
查看次数

的std :: vector.at().它是返回引用还是副本?

我刚开始学习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)

c++ stdvector

7
推荐指数
3
解决办法
625
查看次数

在std :: remove_if执行期间遍历容器是否安全?

假设我想从中删除唯一元素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会将移至 …

c++ algorithm stdvector

7
推荐指数
2
解决办法
134
查看次数