如何将向量大小与整数进行比较?

12
我正在使用以下代码,如果向量(声明为vector<int> vectorX)的大小与预期不同,则会引发错误。
vector<int> vectorX;
int intendedSize = 10;
// Some stuff here
if((int)(vectorX.size()) != (intendedSize)) {
    cout << "\n Error! mismatch between vectorX "<<vectorX.size()<<" and intendedSize "<<intendedSize;
    exit(1);
}

cout语句显示两者大小相同。比较结果并未显示它们相等。

输出为Error! mismatch between vectorX 10 and intendedSize 10

错误出在哪里?之前我尝试了(unsigned int)(intendedSize),但结果也显示它们不相等。


2
另外,请向我们展示您的实际代码。 - NPE
@NPE 抱歉,我试图通过在问题中输入代码来简化实际代码。在这个过程中,我打了一个错字。 - user13107
3
写一个简短的完整程序来演示问题,然后在发布之前,编译并执行它,以测试它是否确实存在与您想象中相同的问题。您会发现演示程序并没有您想象中的那个问题,实际上问题出现在您认为的地方以外。因此,请继续寻找问题所在。 - Andrew Tomazos
3个回答

30

我写这个答案是因为另外两个答案,包括被采纳的那个,都是错误的。 std::vectorsize() 方法的类型既不是 unsigned int,也不是 size_t

std::vector<T> 的大小类型是 std::vector<T>::size_type

就这样。在一些体系结构和编译器上,它可能与 size_t 相同,在其他一些情况下则可能不同。假设变量的类型为 size_t 可以容纳与 std::vector<T>::size_type 类型相同的值是错误的。

要检查向量的大小是否正确,您可以执行以下操作:

if(vec.size() != static_cast<std::vector<int>::size_type>(expected_size)) {
    std::cerr << "Error!" << std::endl;
}

1
所以你的意思是如果你想使用索引迭代向量,你应该键入for (std::vector<int>::size_type i=0; i<myVec.size(); ++i) {..}?我认为唯一合理的编写方式是使用auto,委员会在想什么?为什么不只是使用int? - Nils

10

在 if 语句的右侧缺少 )

if((int)(vectorX.size()) != (intendedSize)) {
                                          ^^^
}

请注意,将std::vector::size的返回值强制转换为int是不好的。这样会丢失大小可能性的一半(感谢chris的指出)。

你应该这样写:

size_t intendedSize = 10; 
// OR unsign int intendedSize  = 10; 
if(vectorX.size() != intendedSize) {
}

2
谢谢。你的意思是我们不能从size_t转换为int,但我们可以从int转换为size_t吗? - user13107
@user13107,你失去了尺寸可能性的一半。 - chris
谢谢。我已经更正了打字错误。即使如此,值仍然没有显示为相等。你所说的强制转换,是这背后的原因吗?实际上,我不想使用 size_t intendedSize,因为该变量在其他地方被用作 int - user13107
或者使用无符号整数,你可以这样做吗? - billz
你还在前面使用(int)(vectorX.size())吗?否则从int转换为unsigned int应该没问题。 - billz
显示剩余5条评论

3

使用size_t类型来保存集合的大小:

vector<int> vectorX;
size_t intendedSize = 10;
// Some stuff here
if(vectorX.size() != intendedSize) {
     ... 
}

实际上,在技术上应该使用vector<int>::size_type,但在实践中,这通常是size_t的typedef。
一个int通常是一个带符号的32位整数。 size_t通常是一个无符号的64位整数(在64位体系结构上)或一个无符号的32位整数(在32位体系结构上)。
(请注意,标准不强制执行这些约束。ABI指定了这一点,例如x86和x86-64 ABI。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接