2016-09-29 4 views
1
#include "stdafx.h" 
#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <string> 
#include <iomanip> 
using namespace std; 

vector<string>::iterator findString(vector<string> word, string x) 
{ 
auto beg = word.begin(); 
for (; beg != word.end() && x != *beg; beg++); 
return beg; 
} 

vector<int>::iterator convert(vector<string>::iterator &t, vector<string> &word, vector<int> &amount) 
{ 
vector<int>::iterator count = amount.begin(); 
vector<string>::iterator beg = word.begin(); 
for (; beg != word.end() && beg != t; count++, beg++); 
return count; 
} 
int main() 
{ 
vector<string> word; 
vector<int> amount; 

string x; 

cout << "Please enter words list:" << endl; 

cin >> x; 
word.push_back(x); 
amount.push_back(1); 

while (cin >> x) 
{ 
     vector<string>::iterator t = findString(word, x); 

     if (t != word.end()) //A: Error happens in this line. 
     { 
      vector<int>::iterator i = convert(t,word,amount); 
      (*i) ++; 
     } 
     else 
     { 
      word.push_back(x); 
      amount.push_back(1); 
     } 
} 

for (auto r : word) 
    cout << setw(4) << r; 
cout << endl; 

for (auto r : amount) 
    cout << setw(4) << r; 
cout << endl; 

return 0; 
} 

이 프로그램에서는 각 단어의 입력 수를 계산하고 싶습니다. 문자열 iterator에서 int iterator로 변환 함수를 작성했습니다. 그러나 여전히 작동하지 않으며 반복기가 호환되지 않는다고 말합니다. 뭔가 잘못 됐니? 게다가, 왜 반복자가 해당 정수로 변환 될 수 없는지 혼란 스럽습니다. 그리고 'ptrdiff_t'가있는 이유는 'int'일 경우 더 쉽지 않을까요? 처음으로이 웹 사이트를 사용합니다. 누군가 내 질문에 답변 할 수 있다면 감사 할 것입니다. 감사.반복기가 호환되지 않는 이유는 무엇입니까?

- 두 개의 문자열을 입력하면 런타임 오류가 발생합니다. 디버그 어설 션이 실패했습니다. 파일 : 벡터, 248 행. 표현식 : 벡터 반복자가 호환되지 않습니다. VS2015에서 실행했습니다.

- 라인 A에서 오류가 발생합니다.

마침내 이해합니다. 모두에게 감사드립니다. 정말 고마워, 좋은 하루 되길 빌어!

+2

"작동하지 않습니다"오류가 있습니까? 그것을 게시하십시오. –

+0

iterators는 호환되지 않는다고합니다. –

+0

어떤 오류가 발생 했습니까? – Galik

답변

1

오류는 문자열이나 int 또는 변환과 관련이 없습니다. findString을 호출 할 때마다 vector<string> word의 새 사본을 작성하므로 리턴 된 반복자는 다른 벡터의 반복자입니다 (사본의 반복자). 나중에 다음

vector<string>::iterator findString(vector<string> word, string x) 
{ 
    ... 
} 

그리고, 오류는 다음과 같습니다 : 당신은이

vector<string>::iterator t = findString(word, x); 

if (t != word.end()) //A: Error happens in this line. 

그래서 findString 대신 단어 자체의 단어의 사본에 반복자를 반환하고, MS '벡터 구현은있다 어설 션 오류가 발생했을 가능성이 가장 높기 때문에 다른 벡터의 이터레이터와 비교하려고하면 어설 션 오류가 발생합니다. 대신 참조로 벡터를 전달하십시오. 예를 들면 다음과 같습니다.

vector<string>::iterator findString(vector<string> & word, string x) 
{ 
    ... 
} 

단어는 이제 참조로 전달되므로 복사되지 않습니다.

물론 연습 문제로 먼저 오류를 수정해야하지만 자신의 코드가 작동 한 후에 을 (이미 있으므로) std::find으로 바꾸는 것이 좋습니다. 또한 단어 수를 유지하기 위해 map<string,int>을 사용하면 코드를 크게 간소화 할 수 있습니다. 그리고 다른 몇 가지.

0

두 가지 유형은 단순히 다르며 하나를 다른 것으로 변환 할 수 없습니다. 그것들은 "정수"가 아니며 컨테이너의 한 위치를 추상화합니다.

실제 문제는 귀하의 findString이 단어 벡터의 복사본에 관련된 반복기를 반환하고 있기 때문입니다. 해당 반복자를 word.end()과 비교할 때 두 개의 반복자는 서로 다른 컨테이너를 기준으로하며 VC STL은 정당하게 불평합니다. 시작을 위해 참조로 벡터를 승인하십시오.

관련 문제