是std::vector::begin()从先前C++11等效到std::vector::data()C++ 11?我问这个的原因,早于C++ 11,我曾经把std :: vector :: begin()当作指针,但是在C++ 11之后,它不是,我不能转换为等效的指针.那么,我可以在C++ 11之后使用data()吗?
我必须维持一个自2004年以来没人接触过的计划.
class CSolver
{
...
ClauseIdx add_clause (int * lits, int n_lits);
}
void and2 (CSolver & solver)
{
vector <int> lits;
...
solver.add_clause(lits.begin(), lits.size());
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨说:
错误:没有匹配函数来调用'CSolver :: add_clause(__ gnu_cxx :: __ normal_iterator <int*,std :: vector <int,std :: allocator <int >>>,size_t)'
我试着去投它
solver.add_clause((int*)lits.begin(), lits.size());
Run Code Online (Sandbox Code Playgroud)
但仍有一个抱怨:
错误:从类型'__gnu_cxx :: __ normal_iterator <int*,std :: vector <int,std :: allocator <int >>>>'输入无效,以输入'int*'
我想快速解决这个问题,因为改变CSolver的界面会导致改变整个程序.
提前致谢.
我需要一个二维字符数组,用于垃圾 API,它绝对需要使用数组而不是向量(非常强调这一点,因为我所有的搜索都只有“使用向量”的答案。我希望我能)。
我认为这样做的方法是分配一个大小为行*字符长度的外部数组,而不是这样做:
char** arr;
arr = new char*[100];
// for loop that allocates the internal arrays
Run Code Online (Sandbox Code Playgroud)
但我不确定需要使用什么方法才能使其连续?我是否需要先分配一个巨大的一维数组,然后将一维数组分块分配给二维数组?
可能重复:
std :: vector元素是否保证是连续的?
std :: vector总是包含顺序存储器地址中的数据作为数组[数字]?
相当新的C++.参考这段代码:
for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
Run Code Online (Sandbox Code Playgroud)
特别是在初始化迭代器和结束条件时.向量中的每个元素都有唯一的内存地址指向吗?或者迭代器的工作方式与指针不同?
可能重复:
std :: vector元素是否保证是连续的?
我遇到过一种技术,人们在C++中使用向量来接收或发送MPI操作的数据,因为它据说将元素连续存储在内存中.
但是,我仍然怀疑这种方法对于任何大小的向量是否都会保持稳健,特别是当向量增长到一定大小时,这种假设可能会崩溃.
以下是我所说的一个例子:
MPI_Recv( &partials[0] , partials.size() , mpi_partial , 0,
DALG_ELIMINATE_REQ_MSG ,MPI_COMM_WORLD , &status );
Run Code Online (Sandbox Code Playgroud) 我正在看另一个问题,最高评价的答案说:
其他答案已经提到了RAII,这是一个很好的答案.但是,最好的建议是:首先不要分配动态对象!别写了
Foo * x = new Foo();什么时候你可以写
Foo x;代替.
这对我来说似乎是个好听的建议.基于堆栈的东西已经具有良好且良好的自动生命周期管理.
我的问题是:如何将这个声音建议应用于类似的东西
char * buffer = new char[1024];
stream.read(buffer, 1024);
...do stuff...
delete[] buffer;
Run Code Online (Sandbox Code Playgroud)
如果我是愚蠢的应用,但你如何创建阵列而不使用new[]?
我有一个字符向量,我想将它的内容作为char*传递给另一个函数:
void foo(boost::shared_ptr<std::vector<boost::uint8_t> > data)
{
bar(data->size()?reinterpret_cast<char*>(&(data.get()->front())):NULL);
}
Run Code Online (Sandbox Code Playgroud)
我可以假设数据总是以连续的方式存储吗?谢谢.
考虑以下代码:
vector<uint8_t> v(1);
v.reserve(2);
uint8_t *data = &v.front();
data[1] = 0;
Run Code Online (Sandbox Code Playgroud)
是否存在未定义的行为(C++ 98,C++ 03,C++ 11)?
如果是的话,获得RAII缓冲区(不使用C++ 11)的最佳方法是什么?
假设我有一个std::vector<int>* foo;并且我必须使用它作为int*(int的数组,而不是指向int的指针)用于旧的C类型库PVM.就我而言,这可能会起作用,因为vector它将元素存储在内存中就像数组一样.所以我试过了(int*)foo,但不知怎的,我得到一个我无法调试的错误,所以我认为这一定是问题所在.任何想法,想法,优雅的解决方法?