3

STLベクトルのデフォルトの「fill」コンストラクターを使用して文字列のベクトルを埋めようとしています。ただし、以下のエラーメッセージが表示されます。

10:55: error: conversion from ‘std::vector<std::basic_string<char> >*’ to non-scalar type ‘std::vector<std::basic_string<char> >’ requested

ソースコードは次のとおりです。

#include <vector>
#include <string>
#include <iostream>

using namespace std;

int main()
{
    string x = "abcd";
    vector< string > stv = new vector< string > (10, x);
    for ( int i = 0; i < stv.size(); i++) {
        cout << stv[i] << endl;
    }
    return 0;
}
4

3 に答える 3

3

問題は、new不必要に使用していることです。実際には、割り当てを行う代わりに、コンストラクターを直接使用する必要があります。

std::vector<std::string> stv(10, x);

あなたが持っている方法では、これを行う必要があります:

std::vector<std::string> *stv = new std::vector<std::string>(10, x);

for ( int i = 0; i < stv->size(); i++) {
    cout << (*stv)[i] << endl;
}

また、 を行うのではなく、 をstring x = "abcd";行いますstring x("abcd");。最初のものはデフォルトのコンストラクターを使用して空の文字列オブジェクトを作成し、次に呼び出しoperator=て文字列の内容を設定しますが、2 つ目はコンストラクターを使用して will から構築するchar*方が効率的です。これは、これを行わないのと同じ理由です。

std::vector<std::string> stv = std::vector<std::string>(10, x);

これは 2 つのベクトルを作成し、10 個の要素すべてを 2 番目のベクトルから最初のベクトルにコピーし、2 番目のベクトルを破棄するため、多くの余分な作業が発生します。ただし、ムーブ セマンティクスにより、これは C++11 ではあまり問題になりません。

于 2012-12-21T06:29:47.797 に答える
1

主な問題は、stv動的に割り当てるために新しくする必要のないポインターではないことです。次のように修正できます。

std::vector< std::string > stv(10, x);
于 2012-12-21T06:27:35.520 に答える
1

std::vector へのポインターを std::vector に割り当てようとしています。

std::vector コンストラクターを直接使用することもできます。

std::vector<std::string>    stv(10, x);

または、std::vector へのポインターを使用できます。

std::vector<std::string>*   stv = new std::vector<std::string>(10, x)

幸運を

于 2012-12-21T06:31:38.410 に答える