如何在 C++ 中的字符串向量中找到重复的单词?

Vef*_*hug 4 c++ string vector

我有一个std::vector<string>每个元素都是一个单词的地方。我想打印没有重复单词的矢量!

我在网上搜索了很多,找到了很多材料,但我不能也不想使用哈希映射、迭代器和“高级”(对我而言)的东西。我只能使用纯字符串比较,==因为我仍然是初学者。

所以,让my_vecastd::vector<std::string>从 std 输入初始化。我的想法是读取所有向量并在找到后删除任何重复的单词:

  for(int i=0;i<my_vec.size();++i){
    for (int j=i+1;j<my_vec.size();++j){
      if(my_vec[i]==my_vec[j]){
        my_vec.erase(my_vec.begin()+j); //remove the component from the vector
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

我试图测试 std::vector<std::string> my_vec{"hey","how","are","you","fine","and","you","fine"}

确实我发现

嘿,你好吗?

所以它似乎是对的,但例如,如果我写了简单的向量 std::vector<std::string> my_vec{"hello","hello","hello","hello","hello"}

我得到

你好你好

问题是每次调用erase维度都会变小,所以我会丢失信息。我怎样才能做到这一点?

Who*_*aig 6

对现有代码的极简方法。的自动增量j最终会破坏您的算法。不要那样做。相反,仅当您不删除元素时才增加它。

IE

for (int i = 0; i < my_vec.size(); ++i) {
    for (int j = i + 1; j < my_vec.size(); ) {  // NOTE: no ++j
        if (my_vec[i] == my_vec[j]) {
            my_vec.erase(my_vec.begin() + j);
        }
        else ++j; // NOTE: moved to else-clause
    }
}
Run Code Online (Sandbox Code Playgroud)

字面意思就是这样。