2015-08-26 9 views
0

у меня есть две строки векторов,Сравнить элементы в векторах

std::vector<std::string> tasks; 
std::vector<std::string> completedTasks; 

задачи будут иметь элементы, такие как, task1, task2, task3

completedTasks будет иметь элементы, такие как, task2, task4

Я хочу проверять каждую задачу с каждым completedTask, если оба совпадения затем возвращают true.

Например, task1 от tasks vector будет сравниваться с предметами в completedTasks вектор. так как он не будет соответствовать никаким предметам в completedTasks, должен вернуть false. task2 будет соответствовать товару в completedTasks вектор, поэтому необходимо вернуть true.

http://cpp.sh/9ggr

Можем ли мы с find_if?

+0

Оба списка отсортированы в одном порядке? – cup

+0

Вы можете использовать find_if с такой функцией, как return currentTask == currentCompletedTask –

+0

Хм, возможно, задачи == завершены. Задачи делают это. Но std :: mismatch определенно делает. – Melkon

ответ

0

Просто сравните векторы для равенства! Нет необходимости в алгоритмах или чем-то сложном.

const bool the_same = (tasks == completedTasks); 

std::vector<>::operator== сравнивает размеры, а затем сравнивает каждый операндов операндов элементы в порядке.

+1

Я думаю, что OP означает, что если какая-либо запись в векторах соответствует, true нужно вернуть! – CinCout

+0

@Garg: _ «Я хочу проверять каждую задачу с каждой завершенной таблицей, если оба совпадения возвращают true». _ Вы можете только «возвращать истину» один раз, поэтому, если OP означает, что вы сказали, тогда они должны быть намного яснее , –

+1

да. Подождем @Nic, чтобы очистить то, что он хочет. ;) – CinCout

0

Вы можете использовать нечленом operator==, как:

template<typename T, typename A> 
bool operator==(vector<T, A>& lhs, vector<T, A>& rhs); 

Затем сделайте completedTasks == tasks

Или использовать std::equal (проверка размеров равны первым) :

tasks.size() == completedTasks.size() && 
    std::equal(tasks.begin(), tasks.end(), completedTasks.begin()); 

Обратите внимание, что вышеуказанный вариант является возможным способом реализации operator==, но не всегда.

0

Позвольте мне intoduce вам лучший способ достичь его с помощью set::set<std::string>:

#include <set> 
#include <vector> 
#include <iostream> 
using namespace std; 

int main() { 
    vector<string> tasks; 
    set<string> completed; 

    tasks.push_back("task1"); 
    tasks.push_back("task2"); 
    tasks.push_back("task3"); 
    tasks.push_back("task4"); 

    completed.insert("task2"); 
    completed.insert("task3"); 

    // write all completed tasks 
    for(set<string>::iterator it=completed.begin(); it!=completed.end(); it++) 
    { 
     cout << *it << " is completed, sir!\n"; 
    } 

    // check if task3 is completed 
    if(completed.find("task1") != completed.end()) cout << "#1 is completed\n"; 
    else cout << "#1 is not completed\n"; 
    return 0; 
} 

Живая демонстрация: http://ideone.com/dvgGAH

0

Это то, что я пытаюсь,

Но без цикл,

for (unsigned int i = 0; i < tasks.size(); i++) 
{ 
    if (std::find(completedTasks.begin(), completedTasks.end(), tasks[i]) != completedTasks.end()) 
    { 
     return true; 
    }  
} 
+0

Проверьте мой ответ и его демо-версию @Nic :) – 5208760

+1

Если вам нужно проверить каждое значение, вы не можете сделать это без цикла. – EvgeniyZh

+0

Но вы можете заменить for_each или пока, например – EvgeniyZh