标签: stdvector

31
推荐指数
1
解决办法
1626
查看次数

std :: vector向下调整大小

C++标准似乎让有关能力的副作用通过或者没有声明 resize(n),与n < size(),或clear().

它确实作出了关于摊销成本push_backpop_back- O(1)的声明

我可以设想一种实现通常的容量变化和CLRS算法(例如,放大时加倍,减少时减半size to < capacity()/4).(Cormen Lieserson Rivest Stein)

有没有人参考任何实施限制?

c++ resize vector std stdvector

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

std :: vector <std :: string>到char*数组

我有一个std::vector<std::string>我需要用于C读取的函数的参数char* foo.我已经看到 如何转换std::stringchar*.作为新手C++,我正在尝试拼凑如何在矢量的每个元素上执行此转换并生成char*数组.

我已经看到了几个密切相关的SO问题,但大多数问题似乎都说明了朝着另一个方向发展的方法std::vector<std::string>.

c c++ stl stdvector

30
推荐指数
3
解决办法
4万
查看次数

指向std :: vector和std :: list元素的指针

我有std::vector一些类的元素ClassA.另外,我想创建一个索引,使用a std::map<key,ClassA*>将一些键值映射到指向向量中包含的元素的指针.

当在向量的末尾添加元素(未插入)时,是否保证这些指针保持有效(并指向同一对象).即,以下代码是否正确:

std::vector<ClassA> storage;
std::map<int, ClassA*> map;

for (int i=0; i<10000; ++i) {
  storage.push_back(ClassA());
  map.insert(std::make_pair(storage.back().getKey(), &(storage.back()));
}
// map contains only valid pointers to the 'correct' elements of storage
Run Code Online (Sandbox Code Playgroud)

情况怎么样,如果我用std::list而不是std::vector

c++ pointers stl stdvector

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

为什么空向量调用值类型的默认构造函数?

使用g ++,我观察到创建一个大小为零的向量会调用向量的参数化对象类型的构造函数一次.然后它被删除.为什么会这样?

#include <iostream>
#include <vector>
using namespace std;

class s
{
    public:
    s() { cout << endl << "default s constructor" << endl; }
    ~s() { cout << endl << "default s destructor" << endl; }

};

int main()
{
    vector<s> v(0);
}
Run Code Online (Sandbox Code Playgroud)

输出:

默认的构造函数

默认的析构函数

c++ stl vector stdvector

29
推荐指数
2
解决办法
2158
查看次数

我应该总是在函数结束时调用vector clear()吗?

我有一些使用这样的矢量的简单函数(伪代码):

void someFunc(void) {

    std::vector<std::string> contentVector;

    // here are some operations on the vector

    // should I call the clear() here or this could be ommited ?
    contentVector.clear();

}
Run Code Online (Sandbox Code Playgroud)

我应该调用clear()还是可以省略这个?

c++ stl vector stdvector

29
推荐指数
3
解决办法
9294
查看次数

为什么重新分配矢量副本而不是移动元素?

可能重复:
如何在向量增长时强制执行移动语义?

insert,push_backemplace(_back)可能导致的重新分配std::vector.我很困惑地看到以下代码复制元素而不是在重新分配容器时移动它们.

#include <iostream>
#include <vector>

struct foo {
    int value;

    explicit foo(int value) : value(value) {
        std::cout << "foo(" << value << ")\n";
    }

    foo(foo const& other) noexcept : value(other.value) {
        std::cout << "foo(foo(" << value << "))\n";
    }

    foo(foo&& other) noexcept : value(std::move(other.value)) {
        other.value = -1;
        std::cout << "foo(move(foo(" << value << "))\n";
    }

    ~foo() {
        if (value != -1)
            std::cout << "~foo(" …
Run Code Online (Sandbox Code Playgroud)

c++ stdvector move-semantics c++11

28
推荐指数
3
解决办法
6493
查看次数

boost :: python:Python列表到std :: vector

最后我可以使用[]运算符在python中使用std :: vector.诀窍是简单地在boost C++包装器中提供一个处理内部向量内容的容器:

#include <boost/python.hpp>
#include <vector>
class world
{
    std::vector<double> myvec;

    void add(double n)
    {
        this->myvec.push_back(n);
    }

    std::vector<double> show()
    {
     return this->myvec;
    }
};

BOOST_PYTHON_MODULE(hello)
{
    class_<std::vector<double> >("double_vector")
        .def(vector_indexing_suite<std::vector<double> >())
    ;

    class_<World>("World")
     .def("show", &World::show)
        .def("add", &World::add)
    ;
 }
Run Code Online (Sandbox Code Playgroud)

另一个挑战是:如何将python列表转换为std :: vectors?我试图添加一个c ++类,期望std :: vector作为参数,并添加了相应的包装代码:

#include <boost/python.hpp>
#include <vector>
class world
{
    std::vector<double> myvec;

    void add(double n)
    {
        this->myvec.push_back(n);
    }

    void massadd(std::vector<double> ns)
    {
        // Append ns to this->myvec
    }

    std::vector<double> show()
    {
     return this->myvec;
    }
};

BOOST_PYTHON_MODULE(hello)
{ …
Run Code Online (Sandbox Code Playgroud)

python boost stdvector boost-python

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

没有 bool 数组的类模板特化?

根据https://en.cppreference.com/std::vector<bool>具有类模板专业化,而std::array<bool, N>没有。不提供的原因有哪些?

c++ stdvector template-specialization class-template stdarray

27
推荐指数
4
解决办法
1205
查看次数

否定std :: vector的最快方法

假设我有一个double的std :: vector,即

std::vector<double> MyVec(N);
Run Code Online (Sandbox Code Playgroud)

在哪里N这么大,性能很重要.现在假设这MyVec是一个非平凡的向量(即它不是一个零向量,但已被某些例程修改).现在,我需要向量的否定版本:我需要-MyVec.

到目前为止,我一直在实施它

std::transform(MyVec.cbegin(),MyVec.cend(),MyVec.begin(),std::negate<double>());
Run Code Online (Sandbox Code Playgroud)

但是,实际上,我不知道这是否合情合理,或者只是我身边的超级天真.

我做得对吗?或者std :: transform在这种情况下只是一个超级慢的例程?

PS:我一直在使用BLAS和LAPACK库,但是我没有发现任何符合这种特殊需求的东西.但是,如果BLAS/LAPACK中存在比std :: transform更快的函数,我很高兴知道.

c++ optimization blas stdvector lapack

26
推荐指数
2
解决办法
3335
查看次数