我有以下代码在Visual Studio 2017上运行。此代码是在数组上实现线性搜索的简单练习。
使用模板是因为该函数将用于任何类型的数组,char数组,int数组等。
#include "stdafx.h"
#include <iostream>
#include <vector>
template <typename T>
int linearSearch(T* arr, int size, T varToSearch) {
for (int i = 0; i < size; i++) {
if (arr[i] == varToSearch) return i;
}
return -1;
}
int main()
{
std::cout << linearSearch({ 'a','b','c','d' }, 4, 'd') << std::endl;
return 0;
}
我得到标题错误,经过长时间搜索,我没有发现问题。
关于错误here的Microsoft页面没有相关信息来了解正在发生的事情。
对我来说,该功能应该这样运行:我具有 typename T ,该类型基本上是int或char。假设它是一个字符。
当我传递 {'a','b','c','d'} 时,它将衰减为指针,并且因为T的类型是char ,所以我会得到以下信息:
int linearSearch(char* arr, int size, char varToSearch)
对我来说应该正常工作。
编辑
在阅读评论并给出答案的思考之后,这就是如果您也陷于此问题的情况。假设您在函数中使用以下语法:
void exampleFunction(char *text){ \\whatever}
使用该函数时,您可以通过以下操作:
exampleFunction({'a', 'b', 'c'}){ \\whatever}
如果您期望{'a','b','c'}衰减为一个指针,以便您可以使用text []进行迭代,则不会。使用此语法,您将获得 std :: initializer_list 和非数组。
您可以执行以下操作:
char arr[] = {'a', 'b', 'c'};
exampleFunction(arr){ \\whatever};
这样, arr (arr )将衰减为 pointer 。
关于我的代码中的问题,我更喜欢使用std :: vector。
template <typename T>
int linearSearch(std::vector<T> list, T varToSearch) {
for (typename std::vector<T>::iterator it = list.begin(); it != list.end(); it++) {
if (varToSearch == *it) return (it - list.begin());
}
return -1;
}
答案 0 :(得分:3)
因为您不能以这种方式创建数组。这个东西{'a','b','c','d'}称为初始化列表,但不支持运算符重载。因此,您有2个解决方案: 在调用函数之前,先创建数组。 或者,您可以将函数声明更改为按值接受std :: vector,然后将其发送给初始化程序列表,这应该可行。 抱歉,我很谨慎。
答案 1 :(得分:0)
正如其他人提到的那样,您不能这样做。您可以使用向量,但由于某些原因,您可以尝试使用c数组,或者尝试使用更好的替代std :: array。
#include <iostream>
#include <array>
template <typename T, size_t N>
int linearSearch(std::array<T, N> & arr, T varToSearch)
{
int i = 0;
for(auto& element : arr)//iterating through each element
{
if (element == varToSearch)
return i;
++i;
}
return -1;
}
int main()
{
std::array<char, 4> arr1 = {'a','b','c','d'};
std::cout << linearSearch(arr1,'d') << std::endl;
return 0;
}