ints 벡터의 인덱스로 사용하기 위해 strings 벡터에서 특정 요소의 위치를 ​​얻는 방법은 무엇입니까?


99

의 벡터에서 요소의 인덱스를 가져와 strings다른 int유형의 벡터에서 인덱스로 사용하려고 하는데 이것이 가능합니까?

예:

vector <string> Names;
vector <int> Numbers;

 ... 
// condition to check whether the name exists or not
if((find(Names.begin(), Names.end(), old_name_)) != Names.end())  
    {   // if yes
        cout <<"Enter the new name."<< endl;
        cin >> name;
        replace(Names.begin(), Names.end(), old_name_, name);
    }

지금은 위치를 얻으려면 old_name에서 Names특정 요소를 액세스에서 사용하는 벡터 Numbers벡터. 그래서 다음과 같이 말할 수 있습니다.

Numbers[position] = 3 ; // or whatever value assigned here.

나는 사용해 보았다 :

vector <string> :: const_iterator pos;
pos = (find(Names.begin(), Names.end(), old_name_))
Numbers[pos] = 3;

그러나 분명히 이것은 pos유형 문자열 이기 때문에 작동하지 않습니다 !



std :: map 또는 std :: unordered_map을 확인해야합니다.
Etherealone

답변:


158

요소를 가리키는 반복기를 알고있는 벡터에서 요소의 위치를 ​​얻으려면 반복기 v.begin()에서 빼면 됩니다.

ptrdiff_t pos = find(Names.begin(), Names.end(), old_name_) - Names.begin();

지금 당신은 확인해야 pos대하여 Names.size()그 경계 여부를 밖으로 있는지 :

if(pos >= Names.size()) {
    //old_name_ not found
}

벡터 반복기는 배열 포인터와 유사한 방식으로 작동합니다. 포인터 산술에 대해 알고있는 대부분의 내용은 벡터 반복자에도 적용 할 수 있습니다.

C ++ 11부터는 std::distance반복기와 포인터 모두에 대해 빼기 대신 사용할 수 있습니다 .

ptrdiff_t pos = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_));

죄송합니다. @Bob__ 님의 댓글이 보이지 않습니다. 삭제되었을 수 있습니다. 왜 그런지 궁금하네요 ptrdiff_t보다 낫다 size_t때문에 ptrdiff_t 서명 부호없는 정수의 비교의 경고를 올릴 것
전개

3
@Hiraku 그는 자신의 댓글을 삭제했습니다. 그는 ptrdiff_t결과가 음수 인 상황에서도 반복기 쌍 사이의 거리를 동일한 컨테이너에 저장할 수 있기 때문에 사용을 제안 했습니다. 사용 size_t하는 경우 더 작은 이터레이터에서 더 큰 이터레이터를 빼지 않도록주의해야합니다.
dasblinkenlight

보다 정확하게하려면 "#include <algorithm>"을 추가해야합니다 (std :: find를 사용하는 경우). 질문 작성자도이 "포함"을 생략했습니다.
Grag2015

92

색인 std::find을 원하면와 함께 사용할 수 있습니다 std::distance.

auto it = std::find(Names.begin(), Names.end(), old_name_);
if (it == Names.end())
{
  // name not in vector
} else
{
  auto index = std::distance(Names.begin(), it);
}

8
상수 반복자를 사용하지 않는 이유는 무엇입니까?
dani

-1

저는 초보자이므로 여기에 초보자 답변이 있습니다. for 루프의 if는 다른 벡터의 Numbers [i]와 같이 필요할 때 사용할 수있는 i를 제공합니다. 대부분은 예를 들어 보풀이며, for / if는 실제로 모든 것을 말합니다.

int main(){
vector<string>names{"Sara", "Harold", "Frank", "Taylor", "Sasha", "Seymore"};
string req_name;
cout<<"Enter search name: "<<'\n';
cin>>req_name;
    for(int i=0; i<=names.size()-1; ++i) {
        if(names[i]==req_name){
            cout<<"The index number for "<<req_name<<" is "<<i<<'\n';
            return 0;
        }
        else if(names[i]!=req_name && i==names.size()-1) {
            cout<<"That name is not an element in this vector"<<'\n';
        } else {
            continue;
        }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.