How to get position of a certain element in strings vector, to use it as an index in ints vector?

C++

C++ Problem Overview


I am trying to get the index of an element in a vector of strings, to use it as an index in another vector of int type, is this possible ?

Example:

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

Now I want to get the position of old_name in the Names vector, to use it in accessing certain element in Numbers vector. So that I can say:

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

I tried using:

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

but obviously this doesn't work since pos is of type string !

C++ Solutions


Solution 1 - C++

To get a position of an element in a vector knowing an iterator pointing to the element, simply subtract v.begin() from the iterator:

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

Now you need to check pos against Names.size() to see if it is out of bounds or not:

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

vector iterators behave in ways similar to array pointers; most of what you know about pointer arithmetic can be applied to vector iterators as well.

Starting with C++11 you can use std::distance in place of subtraction for both iterators and pointers:

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

Solution 2 - C++

If you want an index, you can use std::find in combination with 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);
}

Solution 3 - C++

I'm pretty sure pointer arithmetic applies the same way here as in arrays.

int getVecPos(std::vector<string> vec, string element){
    int i;
    for(i = 0; i < vec.size(); i++){
        if(vec[i] == element){
            break;
        }
    }
    if(i == vec.size()){
        std::cout<<"No such element as "<<element<<" found. Please enter again: ";
        std::cin>>element;
        i = getVecPos(vec, element);
    }
        
    return i;
}

You can add it to the vec.begin() to get an iterator that you can use for the other vector functions or you can use for finding the index of an element in the array. Example:-

int getVecPos(std::vector<string>, string);//This was the function from earlier.
std::vector<string> UpdateHealables(std::vector<string> healables, string healing_item){
    auto it = healables.begin() + getVecPos(healables, healing_item);
    healables.erase(it);
    return healables;
}

Solution 4 - C++

The best way to find the position or index of an element in a vector of integers using C++ (20) is following:

(https://github.com/cppcodes/files/blob/main/find_element_in_vector_of_integers.cpp)

#include <iostream>
#include <vector>

using namespace std;

int64_t find_element_in_vector_of_integers(const int &element, vector <int> &vector_of_integers)
{
	// Define an iterator pointing to the element in vector of integers
	vector<int>::iterator it = find(vector_of_integers.begin(), vector_of_integers.end(), element); // O(N)

	// Check if element was found in vector of integers
	if (it == vector_of_integers.end())
	{
		// Element not found
		return -1;
	}

	// Get element index inside vector of integers
	int64_t index{ distance(vector_of_integers.begin(), it) }; // O(1)

	return index;
}

int main()
{
	vector<int> vector_of_integers{ 7, 10, 75, 16, 4, 2, 29, 5, 73 };
	int element{ 16 };
	int64_t index = find_element_in_vector_of_integers(element, vector_of_integers);

	cout << "The index of '" << element << "' is " << index << endl;

	return 0;
}

Solution 5 - C++

I am a beginner so here is a beginners answer. The if in the for loop gives i which can then be used however needed such as Numbers[i] in another vector. Most is fluff for examples sake, the for/if really says it all.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNourView Question on Stackoverflow
Solution 1 - C++Sergey KalinichenkoView Answer on Stackoverflow
Solution 2 - C++juanchopanzaView Answer on Stackoverflow
Solution 3 - C++HoenView Answer on Stackoverflow
Solution 4 - C++JRbarrosView Answer on Stackoverflow
Solution 5 - C++javerView Answer on Stackoverflow