Làm thế nào để lấy vị trí của một phần tử nhất định trong vectơ chuỗi, để sử dụng nó làm chỉ mục trong vectơ ints?


99

Tôi đang cố gắng lấy chỉ mục của một phần tử trong một vectơ strings, để sử dụng nó làm chỉ mục trong một vectơ khác cùng intloại, điều này có khả thi không?

Thí dụ:

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

Bây giờ tôi muốn lấy vị trí của old_nametrong Namesvectơ, để sử dụng nó trong việc truy cập phần tử nhất định trong Numbersvectơ. Vì vậy, tôi có thể nói:

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

Tôi đã thử sử dụng:

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

nhưng rõ ràng điều này không hoạt động vì poslà kiểu chuỗi!



Bạn nên kiểm tra std :: map hoặc std :: unardered_map.
Etherealone

Câu trả lời:


158

Để có được vị trí của một phần tử trong một vectơ khi biết một trình vòng lặp trỏ đến phần tử, chỉ cần trừ v.begin()từ trình vòng lặp:

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

Bây giờ bạn cần kiểm tra poslại Names.size()xem nó có nằm ngoài giới hạn hay không:

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

trình vòng lặp vectơ hoạt động theo những cách tương tự như con trỏ mảng; hầu hết những gì bạn biết về số học con trỏ cũng có thể được áp dụng cho trình vòng lặp vectơ.

Bắt đầu với C ++ 11, bạn có thể sử dụng std::distancethay cho phép trừ cho cả trình vòng lặp và con trỏ:

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

Xin lỗi, tôi không thấy nhận xét của @Bob__, có thể đã bị xóa? Tôi đang tự hỏi tại sao ptrdiff_tlà tốt hơn so với size_ttừ ptrdiff_t sẽ nâng cao một cảnh báo đối chiếu giữa signed và unsigned integer
Hiraku

3
@Hiraku Anh ấy đã xóa bình luận của mình. Anh ấy đề xuất sử dụng ptrdiff_tvì nó cho phép bạn lưu trữ khoảng cách giữa bất kỳ cặp trình vòng lặp nào vào cùng một vùng chứa, ngay cả trong các tình huống khi kết quả là âm. Nếu chúng ta sử dụng, size_tchúng ta phải cẩn thận để không trừ một trình vòng lặp lớn hơn từ một trình vòng lặp nhỏ hơn.
dasblinkenlight

Để chính xác hơn, bạn nên thêm "#include <algorithm>" (để sử dụng std :: find). Tác giả của câu hỏi cũng bỏ qua "bao gồm" này.
Grag2015

92

Nếu bạn muốn một chỉ mục, bạn có thể sử dụng std::findkết hợp với 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
tại sao không sử dụng const-iterator?
dani

-1

Tôi là người mới bắt đầu nên đây là câu trả lời cho người mới bắt đầu. Vòng lặp if trong vòng lặp for cung cấp cho i, sau đó có thể được sử dụng nhưng cần thiết, chẳng hạn như Numbers [i] trong một vectơ khác. Hầu hết là lông tơ vì lợi ích ví dụ, vì / nếu thực sự nói lên tất cả.

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;
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.