首页 > 解决方案 > 在 for 循环中使用 auto vs decltype(vec.size()) 处理字符串向量

问题描述

教自己一些使用向量和字符串的细节。为此,我将一个段落输入标准输入,将每个单词存储在字符串向量中的一个单独元素中以进行处理。我知道可能有更好的方法来实际处理文本信息,我只是想做一些练习来理解更多。所以,我在处理向量的循环中有几个选择。我在源代码中找到的两种方法是使用auto声明和decltype声明。两者似乎与我相当,但decltype在我眼中有点笨拙且可读性差。有什么特别的理由使用一个与另一个?是不是更有优势?一个更安全吗?或者,明确声明是否有任何优点/缺点size_type在循环?这是我的一些代码,每个代码用于说明,但我相信你们中的大多数人都明白我在说什么。

#import <iostream>
#import <string>
#import <vector>

int main()
{
    std::vector<std::string> vec;
    std::string input;

    while(std::cin >> input)
        vec.push_back(input);

    //auto for loop
    for(auto i = 0; i != vec.size(); ++i)
    {
        //processing
    }

    //decltype for loop
    for(decltype(vec.size()) i = 0; i != vec.size(); ++i)
    {
        //processing
    }

    return 0;
}

标签: c++c++17

解决方案


在这种情况下,问题auto是它会变成int,这是有符号的 VS 无符号的size。即使它不会因为您使用!=而导致任何比较问题,但如果您出于某些原因<想再次比较,您可能最终会在循环中遇到问题。size对于该decltype版本,对于这种情况来说它是矫枉过正的。通常decltype会使用 with template 代替,因为它当时不知道确切的类型。因此,这种情况下最好的方法应该是unsignedor std::size_t


推荐阅读