2017-09-15 142 views
1

我写了下面的程序打印出一个以a=0,b=1等开头的字母。有人可能请指出为什么使用std :: distance打印出一个空白的-以及我如何摆脱它?为什么std :: distance会打印一个`-`?

// 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; 
} 

工作程序是here

+2

你确定它打印'-'零之前?当我尝试它时,它不会。 –

+0

在你链接你确实有正确的方式dist dist dist = std :: distance(table.begin(),search);但你的代码是不同的 –

+0

@HariomSingh,那是因为我稍后改变了它。 –

回答

4

由于这些两个迭代之间的距离为负;你有他们在错误的顺序。 “较小”的迭代器应该在左边,而不是在右边。

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

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

+0

哦,从来没想过这件事。所以'短跑'显然是负面的迹象!谢谢! :)我会尽快接受你的回答。 –

+0

@UmedhSinghBundela正确。 – cdhowie

+1

@UmedhSinghBundela是否真的打印出“-0-1-2-3”或“0-1-2-3”? – user463035818

3

为什么使用std ::距离是打印出一张空白-

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

我该如何摆脱它?

如果计算后者从早期位置的距离,该距离将是积极的:

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

在这种情况下,你所知道的,但如果你不知道或者不关心为了只有想的绝对距离,你可以使用该功能std::abs它:

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

PS。只有当迭代器是随机访问时,才允许先传递后面的迭代器。

+0

请注意,对于负距离,并非所有容器都可以工作。如果要求计算负距离,某些(可能是大多数)容器(如链表)会给出未定义的行为。 –

0

标准功能std::distance接受[start, target]的范围。所以,你需要写

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

使用或不使用的功能std::distance,你可以只写

auto dist = search - table.begin(); 

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

关于该计划的几句话。

当使用C字符串代替标准容器如std::vector并相应地使用标准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一个电话,如果你想提供你会包括头<iterator>

std::cout << std::distance(table, p) << ' '; 
相关问题