我认为以下代码段完全合法(无论如何都是在MS Visual Studio 2008,C ++上构建)。
我用它来链接到第三方库。但我想因为我传递一个指向vector元素的指针而不是第三方库函数所期望的常规指针,我得到一个运行时错误
C-runtime库检测到的参数无效
我在这里做错了什么?
std::vector<int> vec_ints(27,0);
std::vector<double> vec_doub(27, 0.);
for(int i = 0; i < n; ++i) {
//-Based on my understanding when i >=27, STL vectors automatically reallocate additional space (twice).
vec_ints[i] = ...;
vec_doub[i] = ...;
}
const int* int_ptr = &vec_ints[0];
const double* doub_ptr = &vec_doub[0];
//-Func is the 3rd party library function that expects a const int* and const double* in the last 2 arguments.
func(...,...,int_ptr,doub_ptr);
但是在MS Visual Studio 2008(Windows Vista)上构建之后运行它会导致上面提到的运行时错误,即
C运行时库检测到的参数无效
尚未在Linux上对此进行过测试,我确实希望避免将向量内容复制到数组中。有什么想法发生了什么?
进一步编辑以确认使用Nick和Chris的建议,并继续与Vlad等人讨论;这是一段代码片段:
#include <iostream>
#include <vector>
int main() {
for(int i=2; i<6; ++i) {
int isq = i*i;
std::vector<int> v;
v.reserve(4);
for(int j=0; j<isq; ++j) {
v.push_back(j);
}
std::cout << "Vector v: size = " << v.size() << " capacity = " << v.capacity()
<< "\n";
std::cout << "Elements: \n";
for(int k=0; k<v.size(); ++k) {
std::cout << v.at(k) << " ";
}
std::cout << "\n\n";
}
return 0;
}
提供输出:
Vector v: size = 4 capacity = 4
Elements:
0 1 2 3
Vector v: size = 9 capacity = 16
Elements:
0 1 2 3 4 5 6 7 8
Vector v: size = 16 capacity = 16
Elements:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Vector v: size = 25 capacity = 32
Elements:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
22 23 24
至少在这种情况下的用法,在没有使用显式调整大小的情况下,它似乎按预期/预期工作。
答案 0 :(得分:3)
答案 1 :(得分:3)
std::vector<T>
,std::vector<T>::push_back(T &)
(感谢K-ballo)或明确调用std::vector<T>::insert(iterator, T &)
添加元素,则 std::vector<T>::resize(size_t)
会展开。否则,它不会扩展。
std::vector<int> vec_ints;
vec_ints.reserve(27);
std::vector<double> vec_doub;
vec_doub.reserve(27);
for(int i = 0; i < n; ++i) {
vec_ints.push_back(...);
vec_doub.push_back(...);
}
const int* int_ptr = &vec_ints[0];
const double* doub_ptr = &vec_doub[0];
func(...,...,int_ptr,doub_ptr);
你想要那样的东西
答案 2 :(得分:1)
为什么不直接创建具有正确大小的向量?像这样:
std::vector<int> vec_ints(n,0);
std::vector<double> vec_doub(n, 0.);