标签: stdvector

将矢量附加到自身的好方法

我想复制矢量的内容,并希望它们被附加在原始矢量的末尾,即 v[i]=v[i+n] for i=0,2,...,n-1

我正在寻找一种很好的方法,而不是循环.我看到std::vector::insert但迭代版本禁止迭代器*this(即行为未定义).

我也尝试std::copy如下(但它导致分段错误):

copy( xx.begin(), xx.end(), xx.end());

c++ stl stdvector c++11

21
推荐指数
1
解决办法
3218
查看次数

为什么std :: vector是连续的?

除了标准将其定义为连续的事实之外,为什么std :: vector是连续的?

如果空间不足,则需要重新分配新块并将旧块复制到新块,然后再继续.

如果它不连续怎么办?当存储填满时,它只会分配一个新块并保留旧块.当通过迭代器访问时,它会执行简单的>,<检查以查看索引所在的块并将其返回.这样,每次空间不足时都不需要复制数组.

这会真的有用吗?还是我错过了什么?

c++ optimization containers stdvector c++11

21
推荐指数
4
解决办法
5444
查看次数

如何在施工时为std :: vector保留内存?

通常,我呼吁reservestd::vector构建后立即.这通常不会导致std::vector现有的堆分配被销毁并被替换为新的堆分配吗?有没有办法在构建时保留内存而不是分配堆空间然后立即销毁它?或者是否有一个实施技巧,std::vector以确保这不是一个问题?

可用的构造函数似乎只能用于填充std::vectorwith值,而不是显式保留空间.

c++ stdvector

20
推荐指数
1
解决办法
6385
查看次数

从矢量中选择特定元素

我有一个向量v1,和一个v2相同大小的布尔向量.我想从v1所有值中删除,以便并行元素v2false:

vector<int> v3; // assume v1 is vector<int>
for (size_t i=0; i<v1.size(); i++)
    if (v2[i])
        v3.push_back(v1[i]);
v1=v3;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

  • 在C++ 03中
  • 在C++ 11中

c++ stdvector c++11

20
推荐指数
4
解决办法
8567
查看次数

是否保证std :: vector默认构造不会调用new?

根据引用,simple std::vector<T> vec;创建了一个emtpy容器(默认构造函数).这是否保证没有动态内存分配?或者一个实现可能选择保留一些内存?

我知道,对于这个空构造函数,T自C++ 11以来没有类型的构造.但是,我想知道,如果还保证堆上没有分配任何内容.即上面的行只是nullptr堆栈/成员上的几个.

我用vc140测试了它,它确实没有动态分配.

c++ memory-management stdvector

20
推荐指数
2
解决办法
1827
查看次数

为什么这个std :: vector :: emplace_back会失败?

我遇到一个编译错误,说:

试图引用已删除的功能

#include <iostream>
#include <vector>

template <typename T>
struct Container
{
    Container() = default;
    Container(const Container& other) = delete;
    Container(T* ptr) : ptr(ptr) {}
    T* ptr;
    ~Container() { delete ptr; }

};

struct Foo { Foo(int a, int b) {} };

int main()
{
    std::vector<Container<Foo>> myvector;
    myvector.push_back(new Foo(1, 2)); // I understand why this doesn't work.
    myvector.emplace_back((new Foo(1, 2))); // I don't understand why this fails

}
Run Code Online (Sandbox Code Playgroud)

我理解为什么它会在我做的时候尝试引用已删除的构造函数std::vector::push_back(),因为这会复制并需要调用我删除的复制构造函数.

但是std::vector::emplace_back()应该采用它所拥有的类型的构造函数参数.当我向后移动时,我给它一个指向a的指针Foo,这应该转发给Container::Container(T* …

c++ constructor stdvector

20
推荐指数
1
解决办法
1088
查看次数

从std :: vector中删除原始指针

我有以下模式:

  1. 我有一个std::vector包含对象的原始指针(我知道原始指针是"邪恶的",但它是需要维护的遗留软件).
  2. 现在对于向量中的每个元素,我需要做一个测试,如果测试是肯定的,用指针做一些事情,删除它,然后从向量中删除它:

伪代码:

for each pointer in vector
{
  if (SomeTest(pointer))
  {
     DoSomething(pointer)
     delete pointer
     remove pointer from vector
  }
}
Run Code Online (Sandbox Code Playgroud)

我无法想出一些干净利落的代码.

这个链接提供了不同的方法,但它们看起来或多或少都很麻烦.

我现在使用的繁琐解决方案:

for(auto &  p : v)
{
   if (SomeTest(p))
   {
       DoSomething(p);
       delete p;
       p = nullptr;
   }
}

v.erase(std::remove(v.begin(), v.end(), nullptr), v.end());
Run Code Online (Sandbox Code Playgroud)

c++ stdvector

20
推荐指数
3
解决办法
1726
查看次数

使用向量和查找时,C++中未解析的外部

我在一个完全独立的项目中尝试了这个代码,它工作正常(唯一的区别是不工作的项目被导出为DLL).这是代码:

RTATMATHLIB.CPP

#include "stdafx.h"
#include "RTATMATHLIB.h"
#include <math.h>
#include <vector>
#include <algorithm>
#include <stdexcept>

using namespace std;

double someFunc(double** Y, int length)
{
    vector<double> myVector;

    for(int i = 0; i < length; i++)
    {
        double value = (*Y)[i];

        vector<double>::iterator it = find(myVector.begin(), myVector.end(), value);

        if(it != myVector.end())
        {
            continue;
        }
        else
        {
            myVector.push_back(value);
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

RTATMATHLIB.H

__declspec(dllexport) double someFunc(double** Y, int length);
Run Code Online (Sandbox Code Playgroud)

错误

Error   1   error LNK2019: unresolved external symbol __imp___CrtDbgReportW referenced in function "public: __thiscall std::_Vector_const_iterator<double,class …
Run Code Online (Sandbox Code Playgroud)

c++ find unresolved-external stdvector

19
推荐指数
2
解决办法
2万
查看次数

使用范围(迭代器对)初始化std :: array

如何std::array从范围初始化(由一对迭代器定义)?

像这样的东西:

vector<T> v;
...
// I know v has exactly N elements (e.g. I just called v.resize(N))
// Now I want a initialized with those elements
array<T, N> a(???);  // what to put here?
Run Code Online (Sandbox Code Playgroud)

我以为array会有一个构造函数接受一对迭代器,所以我可以做array<T, N> a(v.begin(), v.end()),但它似乎根本没有构造函数!

我知道我可以copy将矢量放入数组中,但我宁愿直接用矢量内容初始化数组,而不是先默认构造它.我怎么能够?

c++ arrays range stdvector c++11

19
推荐指数
3
解决办法
3953
查看次数

为什么这个使用emplace_back与删除的拷贝构造函数不起作用?

我有一个类型,我已经删除了复制构造函数,我想有一个vector这种类型,所以我需要通过创建所有元素emplace_back.但是,emplace_back似乎需要一个复制构造函数,因为编译器会发出一个关于无法实例化的警告,emplace_back因为复制构造函数已被删除.为什么需要复制构造函数?我认为重点emplace_back是建立vector没有复制任何东西.我甚至可以拥有一个vector没有复制构造函数的对象吗?

class MyType {
public:
    MyType(std::array<double, 6> a) {}
    MyType(const MyType& that) = delete;
};

int main() {
    std::vector<MyType> v;
    std::array<double, 6> a = {1,2,3,4,5,6};
    v.emplace_back(a);
}
Run Code Online (Sandbox Code Playgroud)

编译器是clang/llvm.

c++ constructor stdvector emplace

19
推荐指数
2
解决办法
3591
查看次数