0

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

#include <iostream>
#include <string>
#include <map>
#include <stdexcept>
#include <boost/ptr_container/ptr_vector.hpp>

struct TestStruct
{
    std::string str1;
    int var1;
};

struct Config
{
    // Map
    typedef std::map< std::string, boost::ptr_vector<struct TestStruct> > testMap;
};

void foo(Config& config)
{
    if (config.testMap.empty())
    {
        std::cout << "It worked!" << std::endl;
    }
    else
    {
        std::cout << "It didn't work!" << std::endl;
    }
    return;
}

int testMain(void)
{
    Config config;

    foo(config);

    return;
}

int main(void)
{
    try
    {
        return testMain(/*argc, argv*/);
    }
    catch(std::exception& err)
    {
        std::cerr << "Error running program: " << err.what() << std::endl;
        return 1;
    }
    catch(...)
    {
        std::cerr << "Program failed with an unknown exception." << std::endl;
        return 1;
    }
}

私はマップを初めて使用します。これまでマップを使用したことがありません。それらをオンラインで使用する方法の例をたくさん見つけました。残念ながら、それらのより高度な例を理解できないようです。

私がやりたいのは、キー ( std::string) と値 ( boost::ptr_vector<struct>) を持つマップを作成することです。

宣言して正常に渡すことから始めようとしていました。次に、それを埋める方法を試してみたいと思いました。

あいまいなエラーに遭遇しましたが、それを解釈する方法がわかりません。

の「使用」で私が間違ったことについて何か提案はありtestMapますか?

また、誰かがマップを作成する方法の簡単な例を提供できますか?

のキーaと の値が必要だとしますstr1 = "hello", var1 = 10。どうすればいいですか?

フォローアップの質問: Kerrek SB が下に残した回答に関して。

私が次のことをすると...

std::string key   = "a";
TestStruct value = {"hello", 10};
config.testMap[key] = value;

次のエラーが表示されます。

 error: no match for 'operator=' in 'config->Config::testMap.std::map<_Key, _Tp, _Compare, _Alloc>::operator[] [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = boost::ptr_vector<TestStruct, boost::heap_clone_allocator, std::allocator<void*> >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::ptr_vector<TestStruct, boost::heap_clone_allocator, std::allocator<void*> > > >](((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& key)))) = value'
/usr/local/boost/boost_1_38_0_gcc4/include/boost/ptr_container/ptr_vector.hpp:45: note: candidates are: boost::ptr_vector<T, CloneAllocator, Allocator>& boost::ptr_vector<T, CloneAllocator, Allocator>::operator=(std::auto_ptr<boost::ptr_vector<T, CloneAllocator, Allocator> >) [with T = TestStruct, CloneAllocator = boost::heap_clone_allocator, Allocator = std::allocator<void*>]
/usr/local/boost/boost_1_38_0_gcc4/include/boost/ptr_container/ptr_vector.hpp:45: note:                 boost::ptr_vector<T, CloneAllocator, Allocator>& boost::ptr_vector<T, CloneAllocator, Allocator>::operator=(boost::ptr_vector<T, CloneAllocator, Allocator>) [with T = TestStruct, CloneAllocator = boost::heap_clone_allocator, Allocator = std::allocator<void*>]

代わりに.insert()メソッドを実行すると、次のエラーが発生します。

instantiated from here
/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/../../../../include/c++/4.3.2/bits/stl_pair.h:106: error: no matching function for call to 'boost::ptr_vector<TestStruct, boost::heap_clone_allocator, std::allocator<void*> >::ptr_vector(const TestStruct&)'
/usr/local/boost/boost_1_38_0_gcc4/include/boost/ptr_container/ptr_vector.hpp:50: note: candidates are: boost::ptr_vector<T, CloneAllocator, Allocator>::ptr_vector(typename boost::ptr_sequence_adapter<T, std::vector<void*, Allocator>, CloneAllocator>::size_type, const typename boost::ptr_sequence_adapter<T, std::vector<void*, Allocator>, CloneAllocator>::allocator_type&) [with T = TestStruct, CloneAllocator = boost::heap_clone_allocator, Allocator = std::allocator<void*>]
/usr/local/boost/boost_1_38_0_gcc4/include/boost/ptr_container/ptr_vector.hpp:45: note:                 boost::ptr_vector<T, CloneAllocator, Allocator>::ptr_vector(std::auto_ptr<boost::ptr_vector<T, CloneAllocator, Allocator> >) [with T = TestStruct, CloneAllocator = boost::heap_clone_allocator, Allocator = std::allocator<void*>]
/usr/local/boost/boost_1_38_0_gcc4/include/boost/ptr_container/ptr_vector.hpp:45: note:                 boost::ptr_vector<T, CloneAllocator, Allocator>::ptr_vector(const typename boost::ptr_sequence_adapter<T, std::vector<void*, Allocator>, CloneAllocator>::allocator_type&) [with T = TestStruct, CloneAllocator = boost::heap_clone_allocator, Allocator = std::allocator<void*>]
/usr/local/boost/boost_1_38_0_gcc4/include/boost/ptr_container/ptr_vector.hpp:45: note:                 boost::ptr_vector<T, CloneAllocator, Allocator>::ptr_vector() [with T = TestStruct, CloneAllocator = boost::heap_clone_allocator, Allocator = std::allocator<void*>]
/usr/local/boost/boost_1_38_0_gcc4/include/boost/ptr_container/ptr_vector.hpp:35: note:                 boost::ptr_vector<TestStruct, boost::heap_clone_allocator, std::allocator<void*> >::ptr_vector(const boost::ptr_vector<TestStruct, boost::heap_clone_allocator, std::allocator<void*> >&)

ファローアップ:

私が調べたところ、これは不可能です。

ptr_vectorマップでは a を使用できません。(だから私は言われました)所有権/コピーの問題が原因ですか?

「マップ内で発生するはずの ptr_vector をコピーしようとするとどうなりますか? ポインター コンテナーは、ポインターの排他的所有権をモデル化します。

C++0x と std::move でこれを行うことができますが、ここでは役に立ちません。」

誰でも反例を提供できますか?

4

2 に答える 2

1

あなたのクラスConfigにはメンバーが含まれていません!(typedefだけです。)メンバーも定義します。

struct Config
{
    typedef std::map<std::string, boost::ptr_vector<TestStruct> > testMap_type;

    testMap_type testMap; // member
};

また、C ++では、言う必要はありません。struct TestStructただ言うだけTestStructです。

要素を追加するには:

std::string key = "xxx";
TestStruct  val = { "hello", 10 };

// Insert with []-operator
config.testMap[key] = val;

// Insert with insert():
config.testMap.insert(std::pair<std::string, TestStruct>(key, val)); // alternative

編集:申し訳ありませんが、実際のデータ構造を誤って伝えました。std::vectorこれが:の例です。

typedef std::map<std::string, std::vector<int>> MyMap;
MyMap m;

m["hello"].push_back(1);
m["hello"].push_back(2);
m["world"].push_back(3);

あなたの場合、あなたは言うことができますconfig.testMap[key].push_back(val)、またはあなたは新しいベクトルを作ることができます:

boost::ptr_vector<TestStruct> new_v;
// populate new_v;
config.testMap.insert(std::pair<std::string, boost::ptr_vector<TestStruct>>(key, new_v);
于 2011-07-22T18:53:11.743 に答える
1

私が調べたところ、これは不可能です。

マップで ptr_vector を使用することはできません。(だから私は言われました)所有権/コピーの問題が原因ですか?

「マップ内で発生するはずの ptr_vector をコピーしようとするとどうなりますか? ポインター コンテナーは、ポインターの排他的所有権をモデル化します。

C++0x と std::move でこれを行うことができますが、ここでは役に立ちません。」

于 2012-05-17T18:53:31.270 に答える