gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:02:33 27 4
gpt4 key购买 nike

我认为下面的代码片段是完全合法的(无论如何它都是在 MS Visual Studio 2008,C++ 上构建的)。

我用它来链接到第 3 方库。但我认为因为我传递了一个指向 vector 元素的指针而不是第 3 方库函数期望的常规指针,所以我得到了一个运行时错误

Invalid parameter detected by C-runtime library

我在这里做错了什么?

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) 上构建后运行它会导致运行时错误,如上所述,即,

Invalid parameter detected by C runtime library

还没有在 Linux 上测试过这个,我当然想避免为此将 vector 的内容复制到数组中。知道发生了什么事吗?

进一步编辑以确认使用 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

因此,至少在没有使用显式调整大小的上下文中,它似乎按预期/预期工作。

最佳答案

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);

你想要那样的东西

关于C++ 将指针传递给 vector 元素而不是数组指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7856364/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com