如何解决在以下代码中“ bool a_indexable = i <static_cast <int>a.size”是什么意思?
以下是代码:
#include <vector>
#include <string>
std::vector<std::string> zip(
const std::vector<std::string> & a,const std::vector<std::string> & b) {
std::vector<std::string> result;
for (int i = 0; ; ++i) {
bool a_indexable = i < static_cast<int>(a.size()); //I couldn't get what the following two lines mean as I asked in the title,I couldn't get what bool means here and I couldn't get what i < static_cast<int>(a.size()) means here
bool b_indexable = i < static_cast<int>(b.size());
if (!a_indexable && !b_indexable) {
break;
}
std::string element;
if (a_indexable) {
element += a[i];
}
if (b_indexable) {
element += b[i];
}
result.push_back(element);
}
return result;
}
我知道static_cast<int>
在代码中的含义,但是我对它的组合感到困惑,尤其是像i < static_cast<int>(b.size())
这样的组合。如果可以帮助我,请解释一下。
解决方法
a_indexable
是一个布尔值,指示i
是否是向量a
的有效索引。
一种简单的计算a_indexable
的方式是:
bool a_indexable = i < a.size();
但是a.size()
的类型为std::size_t
,它是一个无符号整数。将带符号的整数与无符号的整数混合会很麻烦,因此大多数编译器都会针对i < a.size()
发出警告。解决方案是像您的示例一样,将a.size()
显式转换为i
的类型:
bool a_indexable = i < static_cast<int>(a.size());
,
a.size()
和b.size()
在这里是指std::vector::size()
。 std::vector::size()
返回size_t
(通常是unsigned int
),而不是int
。
正如您在this question中所看到的,将int
与size_t
进行比较将发出警告。通过static_cast
设置为int值,编写此代码的人将摆脱编译器的警告。
这实际上是一种确定给定索引对于向量是否有效的方法,因此可以确保您不要尝试在向量的末尾进行读取。如果索引小于大小,则它是有效的。强制转换避免在比较中混合有符号和无符号值的警告。
但是,我可能只是将i
设置为size_t
类型,这样就不必进行强制转换,尤其是因为i
的范围非常有限。
实际上,我会用不同的方式编写它,以便通过预先获取公共长度(两种长度的最小值)然后分段进行处理,从而完全避免这种逻辑。之类的东西(具有某种类型的别名优势,使代码在一点点模式下可读,并且作为完整的程序显示了最小的测试工具):
#include <vector>
#include <string>
using vecString = std::vector<std::string>;
vecString zip(const vecString &a,const vecString &b) {
vecString result;
auto asz = a.size();
auto bsz = b.size();
auto common_sz = std::min(asz,bsz);
// Handle common size,both vectors are guaranteed
// to have elements at these indices.
for (size_t i = 0; i < common_sz; ++i)
result.push_back(a[i] + b[i]);
// Handle where sizes differ,only ONE of these loop
// bodies will be executed,depending on which is
// larger. Of course,if sizes were identical,// neither loop body will execute.
for (size_t i = common_sz; i < asz; ++i)
result.push_back(a[i]);
for (size_t i = common_sz; i < bsz; ++i)
result.push_back(b[i]);
return result;
}
#include <iostream>
int main() {
std::vector<std::string> vec1,vec2;
vec1.push_back("pax");
vec1.push_back("is");
vec1.push_back("clever");
vec2.push_back("diablo");
auto zipVec = zip(vec1,vec2);
for (const auto &zipString: zipVec)
std::cout << zipString << '\n';
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。