如果你有一个已调整大小的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) 简而言之,我想知道数组是否有类似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对象.那里有这样的东西吗?
我有一个对象的矢量(顺序很重要)(让我们称之为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++中,迭代器是"事物",你可以在其上至少编写解引用运算符*it,增量运算符++it,对于更高级的双向迭代器,减量--it,最后但并非最不重要的是,对于随机访问迭代器,我们需要运算符索引it[]和可能的加法和减法.
C++中的这类"东西"是具有相应运算符重载的类型的对象,或简单和简单的指针.
std::vector<>是一个包装连续数组的容器类,因此指针作为迭代器是有意义的.在网上,在一些文献中你可以找到vector.begin()用作指针.
使用指针的基本原理是开销更少,性能更高,特别是如果优化编译器检测到迭代并执行其操作(向量指令和内容).使用迭代器可能更难以使编译器进行优化.
知道这一点,我的问题是为什么现代STL实现,比如Mingw 4.7中的MSVC++ 2013或libstdc ++,为矢量迭代器使用了一个特殊的类?
说我有一个功能:
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以任何方式专门化).
我正在使用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用最后一部分创建一个新的方法之外还有其他方法吗?
我有以下类型:
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) 非常喜欢这个问题,除了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)
但由于保证向量是连续存储的,所以肯定有更好的方法吗?
我的问题与此类似,但我问的是有点不同.
很明显,可以将第一个std::vector元素的地址用作C类型数组.这意味着在虚拟内存中,std::vector元素是连续的.但是,如果物理内存碎片化,则可能std::vector实际上将其拆分为物理内存中的许多部分.
我的问题是:std::vector元素在物理内存(以及虚拟内存)中是否连续?