C ++将指针传递给vector元素而不是数组指针

时间:2011-10-21 23:30:21

标签: c++ visual-studio-2008 pointers vector

我认为以下代码段完全合法(无论如何都是在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

至少在这种情况下的用法,在没有使用显式调整大小的情况下,它似乎按预期/预期工作。

3 个答案:

答案 0 :(得分:3)

不,矢量不会自动扩展。您需要expand it yourself

if (n > 27)
    vec_ints.resize(n, 0);

答案 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.);