从数组到向量转换的边界
borders in converting from array to vector
我正在尝试学习c++中的向量类。要做到这一点,我正试图从数组转换为向量形式。
in array form
int find_recursively(int *a, int low, int high) {
int mid = (low+high)/2;
if(....)
return find_recursively(a,low,mid+1);
else if(...)
return find_recursively(a,mid+1,high);
}
到向量形式的转换如下:
int find_recursively(vector<int> a) {
int low = 0;
int high = a.size() - 1;
int mid = (low + high) / 2;
if(....) {
vector<int> temp ( a.begin(), a.begin() + mid-2 );
return find_recursively(temp);
}
else if(...) {
vector<int> temp (a.begin()+mid+1, a.begin()+high);
return find_recursively(temp);
}
}
我测试了它,并给出了直接接近力。我认为问题在于边界,我不明白向量边界的逻辑。提前感谢
vector支持索引操作符,所以不要使用vector的切片作为函数参数。传递对向量和索引的引用。与数组相同,但使用vector:
int find_recursively(const vector <int> &a, int low, int high)
,您可以使用[index](例如[low])来访问您的值。但是如果"high"== a.size,尝试使用[high]将使您的SW崩溃。始终记得检查索引是否在向量内。
递归调用时,只需传递相同的'a':
find_recursively(a, low, mid+1);
例如。
您编写的代码,一旦递归深入到大小为2或更小的向量,就会出现问题。在这一点上,你的"mid"值是1,而在你的第一个"if"块中对一个上限的"mid-2"计算产生-1。此外,你的函数会打开一个没有返回语句的代码路径(如果两个"if"条件的值都为false)。
无论如何,你不应该像这样递归地克隆向量。你应该使用迭代器,像这样:template< class Iter >
int find_recursively(Iter low, Iter high) {
Iter mid = low + distance(low, high) / 2;
if (...some test of *mid...) {
return find_recursively(low, mid);
}
else if (...some other test of *mid...) {
return find_recursively(++ mid, high);
}
else {
return (something);
}
}
// call site:
find_recursively(my_vector.begin(), my_vector.end());
.begin()
和.end()
是迭代器,它们提供了一种简单地遍历容器的方法:
for(auto it = vec.begin(); it != vec.end(); ++vec)
cout << *it << " "; // print the contents of vec
注意end()
实际上不是容器的一部分。为什么这很重要?因为它可以用来创建一个更通用的算法版本:
template <class ForwardIt>
int find_recursively(ForwardIt first, ForwardIt last) {
const size_t length = std::distance(first,last);
if(length == 0) {
/* do something accordinlgy */
} else if (length == 1) {
/* do something accordingly */
}
auto mid = first;
std::advance(mid,length/2);
if(....) {
return find_recursively(first, mid);
}
else if(...) {
return find_recursively(mid, first);
}
}
/* example calls: */
std::vector<int> vec = {....};
int result1 = find_recursively(vec.begin(), vec.end());
int array[] = {....};
int result2 = find_recursively(std::begin(array), std::end(array));
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 转换引用对象的边界框?
- 在sfml中获取可转换的边界框
- 如何将矩形(边界框)裁剪的voronoi图转换为一组多边形
- 从数组到向量转换的边界