小编Jam*_*ook的帖子

从字符初始化std :: string

似乎没有标准的构造函数,所以我已经采取了以下措施

void myMethod(char delimiter = ',')
{
    string delimiterString = 'x';
    delimiterString[0] = delimiter;
    // use string version ...
}
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

c++ string initialization char

3
推荐指数
1
解决办法
3645
查看次数

转换shared_ptr的容器

我有一个方法

void foo(list<shared_ptr<Base>>& myList); 
Run Code Online (Sandbox Code Playgroud)

我试图使用两种不同类型的列表调用,其中一个是DerivedClass1,另一个是DerivedClass2

list<shared_ptr<DerivedClass1>> myList1; 
foo(myList1);
list<shared_ptr<DerivedClass2>> myList2; 
foo(myList2);
Run Code Online (Sandbox Code Playgroud)

但是,这显然会产生编译器错误

error: a reference of type "std::list<boost::shared_ptr<Base>, std::allocator<boost::shared_ptr<Base>>> &" (not const-qualified) cannot be initialized with a value of type "std::list<boost::shared_ptr<DerivedClass1>, std::allocator<boost::shared_ptr<DerivedClass1>>>"
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法来转换shared_ptr的容器?可以实现这一目标的备用容器?

更新:感谢所有回复的人.在语言的限制范围内工作,似乎是保持方法"按原样"的最佳方法是使用shared_ptr的容器并准确传递(在调用站点创建新列表).

我想我几乎已经知道了这一点,但是我记得读过有关shared_ptr容器的boost库的其他部分,并且想到也许已经被其他人更优雅地解决了.从我自己的进一步研究来看,这些似乎更倾向于在多个指针独占拥有的情况下减少shared_ptr的开销(因此每个容器需要一个锁而不是容器中每个对象一个).

再次感谢,你们都很棒!

c++ containers boost casting shared-ptr

2
推荐指数
1
解决办法
2819
查看次数

释放java文件句柄

我们有一个用Java编写的相当大而复杂的应用程序,它运行在Gridgain包之上.我遇到的问题是这个应用程序将在每个请求开始前大约一天处理请求,导致java.nio.channels.ClosedByInterruptException类型的异常.

我的假设是应用程序没有释放文件句柄,并且在连续使用一天之后它用完了并且不​​能再继续处理请求(每个请求都需要从每个网格节点读取多个文件).我们已将大部分文件IO操作包装在诸如此类之类的类中

package com.vlc.edge;

import com.vlc.common.VlcRuntimeException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public final class BufferedReaderImpl implements BufferedReader {
    private java.io.BufferedReader reader;

    public BufferedReaderImpl(final String source) {
        this(new File(source));
    }

    public BufferedReaderImpl(final File source) {
        try {
            reader = new java.io.BufferedReader(new FileReader(source));
        } catch (FileNotFoundException e) {
            throw new VlcRuntimeException(e);
        }
    }

    public BufferedReaderImpl(final Reader reader) {
        this.reader = new java.io.BufferedReader(reader);
    }

    public String readLine() {
        try {
            return reader.readLine();
        } catch (IOException e) {
            throw …
Run Code Online (Sandbox Code Playgroud)

java io file handle gridgain

1
推荐指数
2
解决办法
2万
查看次数

修改BOOST_FOREACH中向量的内容

这是一个关于BOOST_FOREACH如何检查它的循环终止的问题

cout << "Testing BOOST_FOREACH" << endl;
vector<int> numbers; numbers.reserve(8);
numbers.push_back(1); numbers.push_back(2); numbers.push_back(3);
cout << "capacity = " << numbers.capacity() << endl;
BOOST_FOREACH(int elem, numbers)
{
    cout << elem << endl;
    if (elem == 2) numbers.push_back(4); 
}
cout << "capacity = " << numbers.capacity() << endl;
Run Code Online (Sandbox Code Playgroud)

给出输出

Testing BOOST_FOREACH
capacity = 8
1
2
3
capacity = 8
Run Code Online (Sandbox Code Playgroud)

但是在循环中途插入的数字4呢?如果我将类型更改为列表,则将重复插入新插入的数字.如果需要重新分配,向量push_back操作将使任何指针无效,但是在此示例中不会发生这种情况.所以我猜的问题是为什么end()迭代器在使用向量时似乎只被评估一次(在循环之前),但在使用列表时有更动态的评估?

c++ foreach boost vector

0
推荐指数
1
解决办法
4125
查看次数

标签 统计

c++ ×3

boost ×2

casting ×1

char ×1

containers ×1

file ×1

foreach ×1

gridgain ×1

handle ×1

initialization ×1

io ×1

java ×1

shared-ptr ×1

string ×1

vector ×1