我已阅读其他帖子,但他们没有完全回答我的问题。 我正在学习从书中删除数组中的元素并尝试应用该代码。 据我所知,我传递数组错误或者是按地址发送整数(不知道背后的含义)。
bool parse_smt2_commands(cmd_context & ctx, std::istream & is, bool
interactive, params_ref const & ps) {
smt2::parser p(ctx, is, interactive, ps);
return p();
答案 0 :(得分:1)
第15行:语法错误 你不能通过一个数字& 如果要通过引用传递,则需要首先创建变量,如:
你的delete_element函数签名与你声明的数组冲突。使用double数组或int数组并确保签名匹配。
delete_element(mass, len , 4);
当你编写没有括号的数组名称时,它与& mass [0]相同 即。指向第一个元素的指针。
完整的更改应该是:
#include <iostream>
#include <cstdlib>
using namespace std;
void delete_element(int x[], int& n, int k);
int main(){
// example of a function
int mass[10] = { 1, 2, 3, 45, 12, 87, 100, 101, 999, 999 };
int len = 10;
for (int i = 0; i<10; i++){ cout << mass[i] << " "; };
cout << endl;
delete_element(mass, len , 4);
for (int i = 0; i<10; i++)cout << mass[i] << " ";
cout << endl;
cin.ignore();
return 0;
}
void delete_element(int x[], int& n, int k){
if (k<1 || k>n){
cout << "Wrong index of k " << k << endl;
exit(1); // end program
}
for (int i = k - 1; i<n - 1; i++)
x[i] = x[i + 1];
n--;
}
答案 1 :(得分:1)
您的代码中存在一些错误。我强调了一些主要问题 1-3 :
exit
,它没有提供任何对象的正确清理,因为它是从C继承而来的。这个程序并不是很重要但它会< / em>成为一个。 cout<<"Wrong index of k "<< k <<endl;
exit(1);
throw std::runtime_error("invalid index");
int&
,但您调用的函数如下:delete_element(mass[10],10&,4);
10&
正在传递10
的地址 。只需传递值10
即可。 std::array
或std::vector
。这些容器知道它们自己的大小,矢量管理它自己的内存,并且可以用最小的努力重新调整大小。使用容器,您还可以访问STL的全部范围,因为它们具有迭代器支持。 我建议你重写代码,实现某种类型的STL容器
答案 2 :(得分:0)
您的计划中有一些错误。
除了一些语法问题,您尝试将int
数组传递给需要double
数组的函数。
您无法传递int
字面值的左值引用。你想要的是传递对int
数组长度的引用。另见http://en.cppreference.com/w/cpp/language/reference。
以下是您的计划的更新版本。
#include <iostream>
#include <cstdlib>
using namespace std;
void delete_element(int x[], int& n, int k);
int main() {
// example of a function
int mass[10] = { 1,2,3,45,12,87,100,101,999,999 };
int len = 10;
for (int i = 0;i < len;i++)
cout << mass[i] << " "; ;
cout << endl;
delete_element(mass, len, 4);
for (int i = 0;i < len;i++) // len is 9 now
cout << mass[i] << " ";
cout << endl;
return 0;
}
void delete_element(int x[], int& n, int k) {
if (k<1 || k>n) {
cout << "Wrong index of k " << k << endl;
exit(1); // end program
}
for (int i = k - 1;i<n - 1;i++)
x[i] = x[i + 1];
n--;
}
答案 3 :(得分:0)
虽然它没有直接回答您的问题,但我想向您展示如何使用C ++以更简单的方式解决您的问题。
#include <vector>
#include <iostream>
void delete_element(std::vector<int>& v, const unsigned i)
{
if (i < v.size())
v.erase(v.begin() + i);
else
std::cout << "Index " << i << " out of bounds" << std::endl;
}
int main()
{
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7};
delete_element(v, 4);
for (int i : v)
std::cout << i << std::endl;
return 0;
}
答案 4 :(得分:0)
您无法从数组中删除元素,因为数组的大小是固定的。鉴于此,只需调用适当的算法函数std::copy即可完成delete_element
的实现。
此外,我强烈建议您使元素删除基于0的值,而不是从1开始。
另一个说明:don't call exit()
in the middle of a function call。
#include <algorithm>
//...
void delete_element(int x[], int& n, int k)
{
if (k < 0 || k > n-1 )
{
cout << "Wrong index of k " << k << endl;
return;
}
std::copy(x + k + 1, x + n, x + k);
n--;
}
Live Example removing first element
std::copy
调用将元素从源范围(由k
之后的元素和最后一个项目(由n
表示))定义到目标范围(元素位于k
)。由于目标不在源范围内,std::copy
调用可以正常工作。