相关疑难解决方法(0)

假设STL向量存储始终是连续的是否安全?

如果你有一个已调整大小的STL向量,是否可以安全地获取元素0的地址并假设其余的向量将跟随内存?

例如

vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
Run Code Online (Sandbox Code Playgroud)

c++ stl vector

55
推荐指数
4
解决办法
1万
查看次数

数组的auto_ptr

简而言之,我想知道数组是否有类似auto_ptr的类型.我知道我可以自己动手,我只是确保那里还没有东西.

我也知道矢量.但我不认为我可以使用它们.我正在使用几个Windows API/SDK,例如Windows Media SDK,Direct Show API,以便返回一些结构来调用一个带有指针和大小两次的函数.第一次传递NULL作为指针,以获取我必须分配的结构的大小,以便接收我正在寻找的数据.例如:

CComQIPtr<IWMMediaProps> pProps(m_pStreamConfig);
DWORD cbType = 0;
WM_MEDIA_TYPE *pType = NULL;

hr = pProps->GetMediaType(NULL, &cbType);
CHECK_HR(hr);

pType = (WM_MEDIA_TYPE*)new BYTE[cbType];   // Would like to use auto_ptr instread
hr = pProps->GetMediaType(pType, &cbType);
CHECK_HR(hr);

// ... do some stuff

delete[] pType;
Run Code Online (Sandbox Code Playgroud)

由于cbType通常返回大于sizeof(WM_MEDIA_TYPE),因为事实上有一个指向其中另一个结构的指针,我不能只分配WM_MEDIA_TYPE对象.那里有这样的东西吗?

c++ arrays memory-management

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

C++ remove_if对象的向量

我有一个对象的矢量(顺序很重要)(让我们称之为myobj类),我试图一次删除多个对象.

class vectorList
{

    vector<*myobj> myList; 
};

class myobj
{

    char* myName;
    int index;
    bool m_bMarkedDelete;
}
Run Code Online (Sandbox Code Playgroud)

我认为最好的方法是将特定的myobj对象标记为删除,然后在向量上调用myList.remove_if().但是,我不确定如何使用谓词等.我应该在对象中创建一个成员变量,它允许我说我要删除myobj然后创建一个谓词来检查成员变量是否已设置?

如何将谓词实现为vectorList类的一部分?

c++ stl predicate vector

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

C++ std :: vector <> :: iterator不是指针,为什么?

只需一点介绍,简单的单词.在C++中,迭代器是"事物",你可以在其上至少编写解引用运算符*it,增量运算符++it,对于更高级的双向迭代器,减量--it,最后但并非最不重要的是,对于随机访问迭代器,我们需要运算符索引it[]和可能的加法和减法.

C++中的这类"东西"是具有相应运算符重载的类型的对象,或简单和简单的指针.

std::vector<>是一个包装连续数组的容器类,因此指针作为迭代器是有意义的.在网上,在一些文献中你可以找到vector.begin()用作指针.

使用指针的基本原理是开销更少,性能更高,特别是如果优化编译器检测到迭代并执行其操作(向量指令和内容).使用迭代器可能更难以使编译器进行优化.

知道这一点,我的问题是为什么现代STL实现,比如Mingw 4.7中的MSVC++ 2013或libstdc ++,为矢量迭代器使用了一个特殊的类?

c++ iterator vector stdvector

21
推荐指数
3
解决办法
3348
查看次数

std :: vector of std :: vectors contiguity

我知道std::vector<T>内部存储它的数据(除非它是std::vector<bool>)旧C++03标准和新标准C++11.

很好的stackoverflow问题处理这个并引用标准:答案,答案.

嵌套向量中的数据怎么样std::vector <std::vector <T> >?怎么存储?

如果每个内部向量都需要连续存储它的数据,那么它怎么可能是真的&v[n] == &v[0] + n for all 0 <= n < v.size().

要说这个略有不同,是否可以"简单地"和顺序地(通过指针或类似)访问存储在这种嵌套结构中的所有元素,就像对一维矢量所做的那样?

c++ vector stdvector

18
推荐指数
3
解决办法
7920
查看次数

将矢量作为数组传递是否安全?

说我有一个功能:

void someFunc(int *x,int count);
Run Code Online (Sandbox Code Playgroud)

这是我无法控制的,所以我不能写它来接受迭代器.

这样调用它是否安全(无论具体的STL实现如何):

vector<int> v;
/* ... */
someFunc(&v[0],v.size());
Run Code Online (Sandbox Code Playgroud)

显然,一个反例就是vector<bool>.其他类型怎么样?(假设我没有vector以任何方式专门化).

c++ arrays stl vector

17
推荐指数
3
解决办法
9413
查看次数

我们可以将部分向量作为函数参数发送吗?

我正在使用vectorc ++程序(我是初学者).
我需要发送一部分vector功能.

如果是c我需要这样做(使用数组):

int arr[5] = {1, 2, 3, 4, 5};
func(arr+2);    //to send part array {3, 4, 5}
Run Code Online (Sandbox Code Playgroud)

除了vector用最后一部分创建一个新的方法之外还有其他方法吗?

c++ vector

16
推荐指数
3
解决办法
9726
查看次数

用平坦的记忆结构替换矢量矢量

我有以下类型:

std::vector<std::vector<int>> indicies
Run Code Online (Sandbox Code Playgroud)

其中内部向量的大小始终为2.问题是,向量在内存中是非连续的.我想用连续的东西替换内部向量,以便我可以抛出扁平数组:

int *array_a = (int *) &(a[0][0])
Run Code Online (Sandbox Code Playgroud)

如果新类型有[]运算符会很好,所以我不必更改整个代码.(如果有必要,我也可以自己实施).我的想法是:

std::vector<std::array<int, 2>>
Run Code Online (Sandbox Code Playgroud)

要么

std::vector<std::pair<int, int>>
Run Code Online (Sandbox Code Playgroud)

这些在内存中看起来如何?我写了一个小测试:

#include <iostream>
#include <array>
#include <vector>
int main(int argc, char *argv[])
{
    using namespace std;

    vector<array<int, 2>> a(100);

    cout << sizeof(array<int, 2>) << endl;

    for(auto i = 0; i < 10; i++){
        for(auto j = 0; j < 2; j++){
            cout << "a[" << i << "][" << j << "] " 
                <<&(a[i][j]) << endl;
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这导致:

8
a[0][0] …
Run Code Online (Sandbox Code Playgroud)

c++ stl vector c++11

11
推荐指数
1
解决办法
882
查看次数

在向量的每个struct元素中重置值的最快方法?

非常喜欢这个问题,除了vector<int>我有vector<struct myType>.

如果我想为myType.myVar向量中的每个元素重置(或者就此而言,设置为某个值),那么最有效的方法是什么?

现在我正在迭代:

for(int i=0; i<myVec.size(); i++) myVec.at(i).myVar = 0;
Run Code Online (Sandbox Code Playgroud)

但由于保证向量是连续存储的,所以肯定有更好的方法吗?

c++ performance vector

8
推荐指数
2
解决办法
929
查看次数

std :: vector元素在物理内存中是连续的吗?

我的问题与类似,但我问的是有点不同.

很明显,可以将第一个std::vector元素的地址用作C类型数组.这意味着在虚拟内存中,std::vector元素是连续的.但是,如果物理内存碎片化,则可能std::vector实际上将其拆分为物理内存中的许多部分.

我的问题是:std::vector元素在物理内存(以及虚拟内存)中是否连续?

c++ memory memory-management vector

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