C ++ передает указатель на элемент вектора вместо указателя массива - PullRequest
2 голосов
/ 22 октября 2011

Я думаю, что следующий фрагмент кода совершенно допустим (он все равно собирается на MS Visual Studio 2008, C ++).

Я использую его для ссылки на стороннюю библиотеку. Но я думаю, что поскольку я передаю указатель на элемент вектора вместо обычного указателя, которого ожидает сторонняя библиотечная функция, я получаю ошибку во время выполнения

В библиотеке времени выполнения C обнаружен неверный параметр

Что я здесь не так делаю?

* * 1010

Но выполнение этого после сборки на MS Visual Studio 2008 (Windows Vista) приводит к ошибке времени выполнения, как упоминалось выше, а именно,

В библиотеке времени выполнения C обнаружен недопустимый параметр

Еще не тестировал это в Linux, и я уверен, что не буду копировать содержимое вектора в массив только для этого. Есть идеи, что происходит?

Дальнейшее редактирование, чтобы подтвердить использование рекомендаций Ника и Криса и продолжить обсуждение с Владом и др .; вот фрагмент кода:

#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 ]

3 голосов
/ 22 октября 2011

std::vector<T> расширяется, если вы добавляете элементы, используя std::vector<T>::push_back(T &), std::vector<T>::insert(iterator, T &) (спасибо K-ballo) или явно вызываете 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);

Вы хотите что-то подобное

3 голосов
/ 22 октября 2011

Нет, вектор не расширяется автоматически.Вам нужно расширить его самостоятельно :

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

и т. Д.

1 голос
/ 22 октября 2011

Почему бы просто не создать векторы с правильным размером для начала?Вот так:

std::vector<int> vec_ints(n,0);
std::vector<double> vec_doub(n, 0.);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...