如何在 std::vector 中查找多个元素
How to find multiple elements in an std::vector
我在尝试查找向量中的多个相同元素时遇到问题。我想每 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());
}`
对于每个 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];
}
}
它也无法编译,您缺少一些 )
。以后post编译演示问题的代码;如果你不知道问题,你就不知道什么对解决它无关紧要。
无论如何,你需要一个循环。我也想要边界检查。并且更少的迭代器<->索引转换。无关紧要的类型更少。
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]);
}
我在尝试查找向量中的多个相同元素时遇到问题。我想每 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());
}`
对于每个 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];
}
}
它也无法编译,您缺少一些 )
。以后post编译演示问题的代码;如果你不知道问题,你就不知道什么对解决它无关紧要。
无论如何,你需要一个循环。我也想要边界检查。并且更少的迭代器<->索引转换。无关紧要的类型更少。
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]);
}