【问题标题】:How to find multiple elements in an std::vector如何在 std::vector 中查找多个元素
【发布时间】:2017-12-15 22:04:36
【问题描述】:

我在尝试在向量中查找多个相同元素时遇到问题。我想每 3 个索引找到重复的元素。如果有重复,则接下来的 2 个元素将进入一个新向量。

std::vector<std::wstring> wsBuf = {"one" , "three", "five", "two", "one","ten", "nine"};`
std::vector<std::wstring> wsWriteFile;
for(DWORD i = 0; i < wsBuf.size(); ++i)
{
  std::vector<std::wstring>::iterator it = wsReadFile.begin(); //wsReadFile has an enumerated list
  it = std::find(it, wsReadFile.end(), wsBuf[i]);
  if(it != wsReadFile.end())
  {
    DWORD index = std::distance(wsReadFile.begin(), it);
    if(index < wsReadFile.size())
    {
       wsWriteFile.push_back(wsReadFile[index];
       wsWriteFile.push_back(wsReadFile[index + 1];
       wsWriteFile.push_back(wsReadFile[index + 2];
    }
  }
}

这只会找到零索引而不是第二个。有谁知道如何使用 C++11 函数找到第二个索引?

我找到了一种不使用 c++11 函数的方法

`for(DWORD i = 0; i < wsBuf.size(); ++i)
 { 
   DWORD j = 0;
   do
   {
     if(wsBuf[i] == wsReadFile[j])
     {
       wsWriteFile.push_back(wsReadFile[index];
       wsWriteFile.push_back(wsReadFile[index + 1];
       wsWriteFile.push_back(wsReadFile[index + 2];
     }
     j+=3;
   }while(j < wsReadFile.size());
}`

【问题讨论】:

标签: c++ c++11 vector find wstring


【解决方案1】:

对于每个wsBuf,您只调用一次find。这清楚地找到了......一个元素。

it = std::find(it, wsReadFile.end(), wsBuf[i]);
if(it != wsReadFile.end())
{
  DWORD index = std::distance(wsReadFile.begin(), it);
  if(index < wsReadFile.size())
  {
     wsWriteFile.push_back(wsReadFile[index];
     wsWriteFile.push_back(wsReadFile[index + 1];
     wsWriteFile.push_back(wsReadFile[index + 2];
  }
}

它也不能编译,你错过了一些)s。将来,发布编译和演示问题的代码;如果你不知道问题,你就无法知道解决问题无关紧要。

无论如何,您都需要一个循环。我也想要边界检查。并且更少的迭代器索引转换。以及更少的无关紧要的类型。

auto it = std::find(wsReadFile.begin(), wsReadFile.end(), wsBuf[i]);
while(it != wsReadFile.end())
{
  auto left = std::distance(it, wsReadFile.end());
  // don't copy past the end:
  auto copy_end = it+(std::min)(left, decltype(left)(3));
  std::copy( it, copy_end, std::back_inserter(wsWriteFile) );
  // find next:
  it = std::find( copy_end, wsReadFile.end(), wsBuf[i]);
}

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 2019-07-30
    • 2010-11-28
    • 2011-12-27
    • 2013-03-08
    • 2015-07-01
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多