Как создать unique_ptr для пары, элементы которой (vector и int) также являются unique_ptr?

== сравнивает ссылки на объекты.

.equals() сравнивает значения String.

Иногда == дает иллюзии сравнения значений String, как в следующих случаях:

String a="Test";
String b="Test";
if(a==b) ===> true

Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:

(a == b) ===> true

                       String Pool
     b -----------------> "test" <-----------------a

Однако == не выполняется в следующем случае:

String a="test";
String b=new String("test");
if (a==b) ===> false

В этом случае для new String("test") оператор new String будет создан в куче, и эта ссылка будет указана на b, поэтому b будет дана ссылка на кучу, а не на String pool.

Теперь a указывает на String в пуле String, а b указывает на String в куче. Из-за этого мы получаем:

, если (a == b) ===> false.

                String Pool
     "test" <-------------------- a

                   Heap
     "test" <-------------------- b

Пока .equals() всегда сравнивает значение String, поэтому дает true в обоих случаях:

String a="Test";
String b="Test";
if(a.equals(b)) ===> true

String a="test";
String b=new String("test");
if(a.equals(b)) ===> true

Таким образом, использование .equals() всегда лучше.

0
задан Nicol Bolas 10 March 2019 в 01:54
поделиться

1 ответ

Похоже, вы пытаетесь передать аргументы конструктора в std::pair в качестве параметров шаблона. То есть вы использовали < > вместо ( ).

Кроме того, поскольку unique_ptr нельзя скопировать, необходимо std::move их передать их конструктору.

Следующий код компилируется с g++ -std=c++17 Move.cc.

#include <vector>
#include <memory>
#include <utility>

using namespace std;

using pairfortsp = pair<unique_ptr<vector<int>>, unique_ptr<int>>;

int main(int argc, char *argv[]){
    unique_ptr<vector<int>> tmpptr1(new vector<int>{1});
    unique_ptr<int> tmpptr2(new int(1));
    unique_ptr<pairfortsp> tmpptr3(new pairfortsp(std::move(tmpptr1),std::move(tmpptr2)));
}
0
ответ дан merlin2011 10 March 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: