STD ::距离为何打印出`` - '

Why does std::distance print out a `-`?

本文关键字:打印 距离 何打印 STD      更新时间:2023-10-16

我编写了以下程序,以打印以a=0b=1等开始的字母出现。有人可以指出为什么使用std ::距离打印出空白的-,以及我如何摆脱它?

// Example program
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    string str;
    cin>>str;
    int n=str.size();
    std::vector<char> table(26);
    table = {
        'a',    'b',    'c',    'd',    'e',    'f',    'g',    'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',    'p',    'q',    'r',    's',    't',    'u',    'v',    'w',    'x',    'y',    'z'
    };
    int i=0;
    while(i<n) {
        char c=str[i];
        auto search = std::find(table.begin(), table.end(), c);
        if(search!=table.end()) {
            int dist = std::distance(search, table.begin());
            cout<<dist;     //prints out -0-1-2-3 instead of 0123, why?
        }
        i++;
    }
    return 0;
}

工作程序在这里

,因为这两个迭代器之间的距离为负;您的顺序错误。"较小"的迭代器应在左侧,而不是右侧。

您有:std::distance(search, table.begin())

您应该有:std::distance(table.begin(), search)

为什么使用std ::距离打印出空白的-

-字符是减号。它用于表示负数。因此,-是因为您打印了负数。距离为负,因为第一个参数比第二个参数。

我怎么能摆脱它?

如果您计算从较早位置到后者的距离,则距离将为正:

std::distance(table.begin(), search);

在这种情况下,您确实知道,但是如果您不知道或不关心该顺序,并且只需要绝对距离,则可以使用函数std::abs获得它:

std::abs(std::distance(it1, it2));

ps。仅在迭代器随机访问时,首先允许传递后者迭代器。

标准函数std::distance接受一系列类型的[start, target]。所以你需要写

auto dist = std::distance( table.begin(), search );

或不使用函数std::distance您只需写

auto dist = search - table.begin();

因为类模板std::vector具有随机访问迭代器。

关于该程序的几句话。

最好使用C字符串而不是std::vector(例如CC_14)并相应地使用标准C函数而不是C 算法时,就是这种情况。

该程序可以看起来以下方式

#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
int main() 
{
    const char *table = "abcdefghijklmnopqrstuvwxyz";
    std::string s;
    std::getline( std::cin, s );
    for ( char c : s )
    {
        c = std::tolower( ( unsigned char )c );
        if ( const char *p = std::strchr( table, c ) )
        {
            std::cout << p - table << ' ';
        }
    }
    std::cout << std::endl;
    return 0;
}

例如,要输入

Umedh Singh Bundela 

然后输出看起来像

20 12 4 3 7 18 8 13 6 7 1 20 13 3 4 11 0

而不是语句中的表达

std::cout << p - table << ' ';

如果需要,您可以使用std::distance的呼叫

std::cout << std::distance( table, p ) << ' ';