【问题标题】:How to get position of a certain element in strings vector, to use it as an index in ints vector?如何获取字符串向量中某个元素的位置,将其用作整数向量中的索引?
【发布时间】:2013-02-26 21:32:51
【问题描述】:

我正在尝试获取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_nameNames 向量中的位置,以使用它来访问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 是字符串类型!

【问题讨论】:

标签: c++


【解决方案1】:

若要在知道指向该元素的迭代器的情况下获取元素在向量中的位置,只需从迭代器中减去 v.begin()

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

现在您需要检查 posNames.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__ 的 cmets,可能被删除了?我想知道为什么ptrdiff_tsize_t 好,因为ptrdiff_t 会发出有符号整数和无符号整数之间比较的警告
  • @Hiraku 他确实删除了他的评论。他建议使用ptrdiff_t,因为它可以让您将任何一对迭代器之间的距离存储到同一个容器中,即使在结果是否定的情况下也是如此。如果我们使用size_t,我们必须注意不要从较小的迭代器中减去较大的迭代器。
  • 更准确地说,您应该添加“#include ”(用于使用 std::find)。问题的作者也省略了这个“包含”。
【解决方案2】:

如果需要索引,可以将std::findstd::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);
}

【讨论】:

  • 为什么不使用常量迭代器?
【解决方案3】:

我很确定指针算法在此处的应用方式与在数组中的应用方式相同。

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

您可以将它添加到 vec.begin() 以获取可用于其他向量函数的迭代器,也可用于查找数组中元素的索引。 示例:-

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

【讨论】:

    【解决方案4】:

    我是初学者,所以这里是初学者的答案。 for 循环中的 if 给出 i ,然后可以使用 但是需要,例如另一个向量中的 Numbers[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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 2021-02-10
      相关资源
      最近更新 更多