如何获取字符串流中存储的字符串数量

发布于 2025-01-11 20:20:10 字数 1063 浏览 0 评论 0原文

我需要测试从 string_view 中提取的 string 数量是否等于特定数字(例如 4),然后执行一些代码。

我是这样做的:

#include <iostream>
#include <iomanip>
#include <utility>
#include <sstream>
#include <string>
#include <string_view>
#include <vector>
#include <iterator>


int main( )
{
    const std::string_view sv { "   a 345353d&  ) " }; // a sample string literal

    std::stringstream ss;
    ss << sv;

    std::vector< std::string > foundTokens { std::istream_iterator< std::string >( ss ),
                                             std::istream_iterator< std::string >( ) };

    if ( foundTokens.size( ) == 4 )
    {
        // do some stuff here
    }

    for ( const auto& elem : foundTokens )
    {
        std::cout << std::quoted( elem ) << '\n';
    }
}

可以看出,上述代码的缺点之一是,如果计数不等于 4,则意味着 foundTokens 的构造完全是浪费,因为它稍后将不会在代码中使用。

有没有办法检查 ss 中存储的 std::string 的数量,然后如果它等于某个数字,则构造向量?

I need to test to see if the number of extracted strings from a string_view is equal to a specific number (e.g. 4) and then execute some code.

This is how I do it:

#include <iostream>
#include <iomanip>
#include <utility>
#include <sstream>
#include <string>
#include <string_view>
#include <vector>
#include <iterator>


int main( )
{
    const std::string_view sv { "   a 345353d&  ) " }; // a sample string literal

    std::stringstream ss;
    ss << sv;

    std::vector< std::string > foundTokens { std::istream_iterator< std::string >( ss ),
                                             std::istream_iterator< std::string >( ) };

    if ( foundTokens.size( ) == 4 )
    {
        // do some stuff here
    }

    for ( const auto& elem : foundTokens )
    {
        std::cout << std::quoted( elem ) << '\n';
    }
}

As can be seen, one of the downsides of the above code is that if the count is not equal to 4 then it means that the construction of foundTokens was totally wasteful because it won't be used later on in the code.

Is there a way to check the number of std::strings stored in ss and then if it is equal to a certain number, construct the vector?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心凉 2025-01-18 20:20:10

不,字符串流内部只是一个字符序列,它不知道所包含的数据可能具有什么结构。您可以首先迭代字符串流并发现该结构,但这并不比简单地提取字符串更有效。

NO, a stringstream internally is just a sequence of characters, it has no knowledge of what structure the contained data may have. You could iterate the stringstream first and discover that structure but that wouldn't be any more efficient than simply extracting the strings.

挖鼻大婶 2025-01-18 20:20:10

您可以执行类似以下操作

    #include <iterator>

    //...

    std::istringstream is( ss.str() );
    auto n = std::distance( std::istream_iterator< std::string >( is ),
        std::istream_iterator< std::string >() );

之后,比较变量 n 的值,您可以决定是否创建向量。

例如

std::vector< std::string > foundTokens;

if ( n == 4 ) foundTokens.assign( std::istream_iterator< std::string >( ss ), std::istream_iterator< std::string >( ) );

You can do it something like the following

    #include <iterator>

    //...

    std::istringstream is( ss.str() );
    auto n = std::distance( std::istream_iterator< std::string >( is ),
        std::istream_iterator< std::string >() );

After that comparing the value of the variable n you can decide whether to create the vector or not.

For example

std::vector< std::string > foundTokens;

if ( n == 4 ) foundTokens.assign( std::istream_iterator< std::string >( ss ), std::istream_iterator< std::string >( ) );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文